【问题标题】:In C# is there no way to make a class define a field using an Interface or abstract class?在 C# 中,有没有办法让一个类使用接口或抽象类定义一个字段?
【发布时间】:2011-08-10 19:23:39
【问题描述】:

我想强制一组类定义三个字段(字符串类型)。 在抽象类中,我得到字段不能是抽象的,而在接口中,我得到一个错误,说接口不能包含字段。 有没有办法做到这一点,或者我没有正确理解这一点?我宁愿不使用方法,因为某些奇怪的原因,括号让我很恼火。

【问题讨论】:

  • 必须使用字段吗?可以改用属性吗?
  • abstract 字段是什么意思?
  • 为什么不在抽象基类中使字段非抽象?
  • 在黑暗中刺杀,但是,我认为他的意思是在基类中声明字段,然后必须在派生/实现类中对其进行初始化。

标签: c# oop interface abstract-class


【解决方案1】:

您可以为此使用属性:

interface MyInterface {
  string Prop1 { get; set; }
  string Prop2 { get; set; }
  string Prop3 { get; set; }
}

【讨论】:

    【解决方案2】:

    接口或抽象成员强制派生类提供代码。
    字段没有代码。

    你应该使用一个属性,它可以像一个字段一样使用,但是有代码。

    【讨论】:

      【解决方案3】:

      您可以使用属性代替字段:

      // works similarly for Interfaces too
      abstract class MyAbstractClass { public virtual string MyProperty1 { get; set; } }
      
      class MyConcreteClass : MyAbstractClass {  }
      

      然后您可以从派生自 MyAbstractClass 的任何实例访问 MyProperty1:

      MyAbstractClass obj1 = new MyConcreteClass; obj1.MyProperty1 = "abcd";

      【讨论】:

      • 你用一个例子打败了我。 @Matt:这是 Java 和 C# 之间的主要区别。他展示的是一个自动实现的属性。您可以将主体添加到抽象类或其子类中的 get 或 set。另请注意:您可以添加任何您喜欢的可见性限制:a) 属性本身。 b) 得到,和 c) 集合。 (所以public和private和internal等)
      【解决方案4】:

      就像其他人说的那样,使用属性而不是字段,但是您可以执行我在 cmets 中对只读成员的解释如下:

      abstract public class Base
      {
          abstract public string Foo { get; }
          abstract public string Bar { get; }
          abstract public string Baz { get; }
      }
      
      public class Derived : Base
      {
          public override string Foo { get { return "foo"; } }
          public override string Bar { get { return "bar"; } }
          public override string Baz { get { return "baz"; } }
      }
      

      如果您希望以后可以修改这些字段,则必须使用 automatic properties 或为每个属性声明具体的支持字段和 getter/setter 对。

      【讨论】:

        猜你喜欢
        • 2010-12-21
        • 2011-06-16
        • 2021-04-02
        • 2014-10-30
        • 1970-01-01
        • 2012-12-15
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多