Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何要求实现接口的所有对象都具有特定字段_C#_Oop_Design Patterns_Interface - Fatal编程技术网

C# 如何要求实现接口的所有对象都具有特定字段

C# 如何要求实现接口的所有对象都具有特定字段,c#,oop,design-patterns,interface,C#,Oop,Design Patterns,Interface,简而言之,我希望实现接口的所有对象都有一个公共字段。我有一个名为IMovable的接口,我希望实现它的每个对象都有一个名为hasmove的公共字段。换句话说,我希望所有对象都有一个字段,就像它们从一个类继承了它一样,但我希望实现多个不同的接口,我不希望有一个类层次结构。解决这个问题的最好办法是什么?我应该使用属性吗?这是我第一次使用接口,我不确定它们是否是解决此类问题的正确解决方案 不幸的是,接口不能包含字段,所以下一步最好的做法是用抽象方法定义一个抽象类,并在该类中声明字段 这样,继承该类的

简而言之,我希望实现接口的所有对象都有一个公共字段。我有一个名为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