C# 获取派生类以实现属性的最佳实践?

C# 获取派生类以实现属性的最佳实践?,c#,inheritance,abstract-class,C#,Inheritance,Abstract Class,给出了一个简单的类层次结构,其中每个类都派生自一个抽象基类。每个派生类都需要以某种方式提供一个枚举“值”,基类将在某些基类方法中使用该值。 e、 g 基类: public abstract class AbstractFoo { bool SaveFoo() { switch (BarType){...} } } public abstract class A { private readonly BarType _foo; protected A(BarTyp

给出了一个简单的类层次结构,其中每个类都派生自一个抽象基类。每个派生类都需要以某种方式提供一个枚举“值”,基类将在某些基类方法中使用该值。
e、 g

基类:

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

}
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) {
  }
}
和派生类

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

public class WhaleFoo:AbstractFoo
{
  //barttype = mammal;
}
有很多方法可以确保从AbstractFoo派生的所有类都实现属性“enum BarType”

然后,在每个派生类中,我可以实现BarType来返回正确的类型,或者添加一个抽象方法来执行类似的操作

public BarType BarType{get{return _bartype;}}
或者添加一个具体的方法来返回一个字段——那么我需要记住添加这个字段,但是它的键入要少得多(C&p)


推荐的方法是什么?

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

例如:

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

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

public abstract class A {
    public BarType Foo;

    public enum BarType {
        Value1,
        Value2
    }
}

public class B : A {
    public BarType Foo { get { return BarType.Value1; } }
}

另一个选项是强制派生类将Foo值传递给基类:

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

}
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) {
  }
}

对不起,鲍德里克抢先一步。是的……花了太长时间才让它看起来漂亮:我已经学会了快速的方法,先把答案写下来,然后再让它看起来漂亮;)这是真的……不过有时候我只是忙于写答案。别忘了接受他的回答!;)哈哈,我几乎从来没有先到过那里,而这次的价格比你的答案更不漂亮…:/我一直都是这样做的……但突然有一个“时刻”你开始怀疑自己了!lolI知道那种感觉:我在发布这个答案时就有这种感觉;)+1因为这是一个可行的选择…但是我会有很多这样的选择,所以如果我可以避免的话,我不想要一个庞大的构造函数。