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

时间:2019-05-17 14:09:45

标签: c# oop design-patterns interface

简而言之,我希望所有实现接口的对象都具有一个公共字段。我有一个名为IMovable的接口,并且我希望实现该接口的每个对象都有一个名为hasMoved的公共字段。换句话说,我希望所有对象都有一个字段,就像它们是从类继承来的一样,但是我想实现多个不同的接口,并且我不想拥有一个类层次结构。解决此问题的最佳方法是什么?我应该使用属性吗?这是我第一次使用接口,我不确定它们是否是解决此类问题的正确方法。

4 个答案:

答案 0 :(得分:1)

  

我希望每个实现它的对象都有一个私有字段,称为   _hasMoved

private字段是不可填写的,因为接口将其全部视为public,因为它是合同。您甚至不能通过abstract类,因为private成员不会被继承。

如果您将其设置为public字段并在界面中包含该合同,该怎么办

public interface IMovable
{
  bool HasMoved { get; set; }
}

答案 1 :(得分:1)

出于记录:不论公共/私有/受保护,接口根本不定义字段,因此根本不可能实现您的期望。

  

我也考虑过使用属性,但这似乎是不合理的,因为我不需要任何其他功能。

问题不在于字段和属性之间的区别,而是因为您试图使用接口来定义 private

接口仅定义公共属性(和方法),因为接口有效地定义了外部调用者已知的 public 接口。

当我说public class Foo : IFoo时,我说的是外部呼叫者可以观察到Foo类的对象,就像它是IFoo一样(他们实际上不需要知道它是Foo还是DifferentFoo)。这必然会迫使我确保Foo履行必要的IFoo合同。

  

简而言之,我希望所有实现接口的对象都具有一个公共字段。

接口定义私有(或受保护的)字段毫无意义,因为外部调用者始终无法访问它们。
此外,由于它是一个私有字段,因此只能在类本身内部使用。无法在任何其他类(包括接口定义或接口的任何其他实现)中定义/引用此字段。

您称它们为“公共”字段,但它们如何共同?除了所属领域的类,没有人可以使用它们。 没有人(甚至没有接口实现本身)也不能访问这些字段中的一个以上,没有可能的通用性(或从中受益)。


如果该语言能够满足您的需求,那么它绝对不会带来任何功能上的好处。没有。如果您(或其他任何人)可以列出任何功能上的好处,我很想听听。

唯一可以争论的好处是,您可以将代码从一个类复制/粘贴到下一个类,因为您可以保证所引用的字段(在粘贴的代码中)具有相同的名称。
但是,如果您要复制/粘贴,则表示做错了什么。每次复制/粘贴代码时,都应该评估是否不尝试解决必要的抽象。在大多数情况下,这就是您正在做的事情,这是不好的做法。


如果这仅仅是不想一遍又一遍地键入相同的字段声明的问题,并且您已经确定不打算在底层进行全面的抽象,则可以研究代码生成工具可以为您生成初始的类定义。

但是,如果仅针对少数几个类别中的少数几个领域,那么付出的努力是不值得的。与复制/粘贴字段声明相比,花费更多的时间来设置生成规则。

答案 2 :(得分:0)

https://csharp.2000things.com/2011/10/28/443-an-interface-cannot-contain-fields/

不幸的是,接口不能包含字段,因此,下一步最好的方法是使用抽象方法定义一个抽象类,并在该类中声明您的字段。

这样,任何继承该类的人都必须定义与接口相似的继承方法,并带有基类的其他字段

答案 3 :(得分:0)

如果您希望只在基类及其所有派生类中使用的字段,请在protected基类中将其声明为abstract,就像private一样也将其隐藏到所有继承的类中。如果它的值对于每个类都应该是通用的,则仍可以使其为constreadonly并在基类中对其进行初始化,因此派生类无法对其进行修改(请参考this question在两个修饰符之间选择)。
正如其他人已经解释的那样,接口仅允许声明public properties 。您要么接受,要么使用抽象类。

编辑:基于OP提供的新信息,我建议在基本接口中使用属性。这是您无需使用抽象类即可最接近共同共享的公共领域的地方。