C# 如何要求实现接口的所有对象都具有特定字段
简而言之,我希望实现接口的所有对象都有一个公共字段。我有一个名为IMovable的接口,我希望实现它的每个对象都有一个名为hasmove的公共字段。换句话说,我希望所有对象都有一个字段,就像它们从一个类继承了它一样,但我希望实现多个不同的接口,我不希望有一个类层次结构。解决这个问题的最好办法是什么?我应该使用属性吗?这是我第一次使用接口,我不确定它们是否是解决此类问题的正确解决方案 不幸的是,接口不能包含字段,所以下一步最好的做法是用抽象方法定义一个抽象类,并在该类中声明字段 这样,继承该类的任何内容都必须定义继承的方法,类似于带有基类附加字段的接口 我希望实现它的每个对象都有一个名为 _移动 无法创建C# 如何要求实现接口的所有对象都具有特定字段,c#,oop,design-patterns,interface,C#,Oop,Design Patterns,Interface,简而言之,我希望实现接口的所有对象都有一个公共字段。我有一个名为IMovable的接口,我希望实现它的每个对象都有一个名为hasmove的公共字段。换句话说,我希望所有对象都有一个字段,就像它们从一个类继承了它一样,但我希望实现多个不同的接口,我不希望有一个类层次结构。解决这个问题的最好办法是什么?我应该使用属性吗?这是我第一次使用接口,我不确定它们是否是解决此类问题的正确解决方案 不幸的是,接口不能包含字段,所以下一步最好的做法是用抽象方法定义一个抽象类,并在该类中声明字段 这样,继承该类的
private
字段,因为接口将具有所有的public
,因为它是一个合同。您甚至不能使用抽象
类,因为私有
成员不是继承的
如果将其设置为公共
字段,并在界面中包含该合同,该怎么办
public interface IMovable
{
bool HasMoved { get; set; }
}
如果希望一个字段仅在基类及其所有派生类中使用,则在
抽象类中将其声明为受保护的
,因为私有类也会将其隐藏到所有继承类中。如果它的值对于每个类都应该是公共的,您仍然可以将其设置为const
或readonly
,并在基类中对其进行初始化,以便派生类无法修改它(请参阅以在两个修饰符之间进行选择)
正如其他人已经解释的,接口只允许声明public
属性。要么接受,要么使用抽象类
编辑:根据OP提供的新信息,我建议在基本界面中使用属性。这是在不使用asbtract类的情况下最接近公共共享字段的地方。请注意:接口根本不定义字段,不管是公共/私有/受保护的,因此您的期望是不可能的
我也考虑过使用属性,但这似乎不合理,因为我不想要任何额外的功能
问题不在于字段和属性之间的区别,而是因为您试图使用接口定义私有属性
接口只定义公共属性(和方法),因为接口有效地定义了外部调用方已知的公共接口
当我说公共类Foo:IFoo
时,我是说外部调用方可以观察Foo
类的对象,就好像它是IFoo
(他们实际上不需要知道它是Foo
或DifferentFoo
)。这内在地迫使我确保Foo
履行必要的IFoo
合同
简而言之,我希望实现接口的所有对象都有一个公共字段
接口定义私有(或受保护)字段毫无意义,因为外部调用方无论如何都无法访问这些字段。
此外,由于它是一个私有字段,因此只能在类本身内部使用。无法在任何其他类(包括接口定义或接口的任何其他实现)中定义/引用此字段
你称它们为“公共”字段,但它们如何都是公共的呢?除了字段所在的类之外,没有人能够使用它们没有人(甚至接口实现本身)可以访问这些字段中的一个以上,没有可能的通用性(或从中受益)
如果语言能够满足您的需求,那么它绝对不会有任何功能上的好处。没有一个如果你(或其他任何人)能列出任何功能性好处,我很想听听
唯一有争议的好处是,您可以将代码从一个类复制/粘贴到下一个类,因为您可以保证(粘贴的代码中)引用的字段具有相同的名称。
但是如果你在复制/粘贴,你就做错了。每次复制/粘贴代码时,您都应该评估您是否没有尝试处理必要的抽象。在大多数情况下,这正是你正在做的,这是一个坏习惯
如果这仅仅是一个不想反复输入相同字段声明的问题,并且您已经确定您没有试图在地毯下扫过必要的抽象,那么您可以研究可以为您生成初始类定义的代码生成工具
但是,如果这只是针对少数类中的少数字段,那么付出的努力就不值得付出。设置生成规则的时间比复制/粘贴字段声明的时间要多。如果您不打算访问某个特定的私有字段,为什么希望它们具有该字段?“我也考虑过使用属性,但这似乎不合理,因为我不需要任何额外的功能。”您能进一步解释吗?为什么带有名为hasmove
的get-only属性的接口不适合您?为什么首先需要一个私有字段是有用的?这似乎是一个典型的示例。但是为什么抽象类不能处理多个接口呢?私有字段是一个实现细节。因此,它从来不是接口的一部分。为什么你关心私有的呢?那就在你的界面上添加一个属性。似乎OP不想要一个属性,因为“这太过分了”。@Him