【问题标题】:Best practice for getting a derived class to implement a property?让派生类实现属性的最佳实践?
【发布时间】:2013-02-14 15:24:49
【问题描述】:

给定一个简单的类层次结构,其中每个类都派生自一个抽象基类。每个派生类都需要以某种方式提供一个枚举“值”,基类将在某些基本方法中使用它。
例如

基类:

public abstract class AbstractFoo
{
  bool SaveFoo()
  {
    switch (BarType){...}
  }

}

和派生类

public class BananaFoo:AbstractFoo
{
  //barttype = fruit;
}

public class WhaleFoo:AbstractFoo
{
  //barttype = mammal;
}

有很多方法可以确保从 AbstractFoo 派生的所有类都实现属性“枚举 BarType”

public abstract BarType BarType{get;}

然后我可以在每个派生类中实现 BarType 以返回正确的类型,或者添加一个抽象方法来做非常相似的事情。

public BarType BarType{get{return _bartype;}}

或者添加一个具体的方法来返回一个字段 - 然后我需要记住添加该字段,但是打字要少得多(C&P)?

推荐的方法是什么?

【问题讨论】:

    标签: c# inheritance abstract-class


    【解决方案1】:

    另一种选择是强制派生类将 Foo 的值传递给基类:

    public abstract class A {
      private readonly BarType _foo;
    
      protected A(BarType foo) {
        _foo = foo;
      }
    
      // Does Foo need to be public or is it only used internally by A?
      public BarType Foo { get { return _foo; } }
    }
    
    public class B : A {
    
      public B() : base(BarType.Value1) {
      }
    }
    

    【讨论】:

    • +1,因为它是一个可行的选择......但是我会有很多这样的,所以如果我可以避免的话,不要想要一个庞大的构造函数。
    【解决方案2】:

    我无法评论执行此操作的正确方法是什么,但我一直在基类型上使用抽象属性(强制实现),然后从子类型属性返回一个常量。

    例如:

    public BarType BarType{get{return BarType.WhaleFoo ;}}
    

    【讨论】:

    • 这就是我一直这样做的方式......但突然有一个“时刻”当你开始怀疑自己!大声笑
    • 我知道那种感觉:我在发布这个答案时就有过这种感觉;)
    【解决方案3】:

    假设您只为每个子类返回一个枚举值,我知道的最好方法是在基类中实现一个抽象属性,然后在每个子类中实现它。

    public abstract class A {
        public BarType Foo;
    
        public enum BarType {
            Value1,
            Value2
        }
    }
    
    public class B : A {
        public BarType Foo { get { return BarType.Value1; } }
    }
    

    【讨论】:

    • 对不起,baldric 刚刚打败了你。
    • 是的......花了太长时间让它看起来很漂亮:P
    • 我知道快速的人会得到一个答案,然后让它看起来不错;)
    • 确实如此……但有时我只是忙于写答案。不要忘记接受他的回答! ;)
    • 大声笑,我几乎从来没有第一个到达那里,而且这次的价格比你的不那么漂亮...:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多