我正在构建自己的基本用户界面类。在它们上,我希望它们都具有相似的“通用”属性和方法。我可以定义一个接口类,但接口似乎只允许抽象方法,没有属性。
我不想将完全相同的代码复制到每个类,但不知道如何实现... 例如:我希望这些常见的东西适用于按钮、文本框、复选框、列表框等用户控件。
建议???
我正在构建自己的基本用户界面类。在它们上,我希望它们都具有相似的“通用”属性和方法。我可以定义一个接口类,但接口似乎只允许抽象方法,没有属性。
我不想将完全相同的代码复制到每个类,但不知道如何实现... 例如:我希望这些常见的东西适用于按钮、文本框、复选框、列表框等用户控件。
建议???
在这种情况下,我通常使用抽象类。创建您的基本抽象类,然后从您的新控件继承它。
您可以在接口上定义属性:接口属性
public interface ISampleInterface
{
// Property declaration:
string Name
{
get;
set;
}
}
您可以在接口中声明一个属性,如下所示:
public interface IMyInterface
{
string Name { get; set; }
int Age { get; set; }
}
但是,在这种情况下,听起来抽象类会更好。
绝对可以在接口上指定属性
interface IFoo {
string Name { get; set; }
string Age { get; } // Read Only
}
但否则你是对的。接口没有指定任何行为,因此只能定义“抽象”方法和属性。必须在每个实施者上完成实施。这就是接口灵活性所付出的代价。
如果所有子类之间的行为确实相同,那么我通常会选择一个抽象类。或者经常是组合。即定义一个接口和一个实现该接口的基本实现。
class Foo : IFoo {
private string _name;
public Name { get { return _name; } set { _name = value; } }
public Age { get { return 42; } }
}
这使您可以灵活地选择使用接口用于由于某种原因不能从 Foo 派生的类的快速实现。
.Net 不允许多重继承,但您可以使用“继承层次结构”来组织您的基类。这就是 .Net 本身的布局方式。
我自己来自 C++ 背景,允许和可扩展地使用多继承,所以我经常遇到和你一样的问题。您需要做的第一件事是阅读混音 - 在这里您会发现自己一直在使用它们,而从未命名它们。第二步是在你需要的时候开始识别你的mixin,你会经常发现你还不如通过组合来使用它们。第三步是使用组合来实现它们......是的,我也讨厌这个,但如果你想去 .NET(或 Java 或......),就没有办法了:)
你应该使用继承的不是你的混入,而是真正识别你的项目的东西。我建议查看一些常用控件(文本框等)的 .NET 层次结构以获得一些灵感。
祝你好运