【问题标题】:Override abstract method return type with concrete type用具体类型覆盖抽象方法返回类型
【发布时间】:2013-12-11 15:12:23
【问题描述】:

我正在尝试做这样的事情:

public abstract class A
{
    public abstract AbstractSomething foobar {get;}
}

public class B : A
{
    public override ConcreteSomething foobar
    {
        get
        {
            return new ConcreteSomething();
        }
    }
}

编译器警告我覆盖类型必须与基类型匹配。我对返回 AbstractSomething 的担忧是我要求用户正确转换返回的值。

实现我的 getter 的最佳方法是什么?不使用泛型是否可以做到这一点?

【问题讨论】:

  • 这里有什么不使用接口的理由吗?
  • 如果你使用抽象方法,那么第一点是你应该在派生类中定义抽象方法。
  • 你为什么使用泛型?
  • 为什么用户必须投射它?如果他引用了你的B,但只知道A,否则他不需要基类,他不能指望得到ConcreteSomething,而只能得到AbstractSomething(这就是抽象类@ 987654326@ 是承诺给他的),所以他根本不需要强制转换它,您可以在覆盖 getter 中返回抽象类。
  • 添加到 pascalhein 的答案中,如果您的调用者希望使用比 AbstractSomething 具有更多功能的类来做某事,那么这不是一个合适的模式。

标签: c# types return overriding abstract


【解决方案1】:

您确实需要使用泛型,但这不是一个糟糕的解决方案:

public abstract class A<T> where T:AbstractSomething
{
    public abstract T foobar { get; }
}

public abstract class AbstractSomething
{
}

public class ConcreteSomething : AbstractSomething
{

}

public class B : A<ConcreteSomething>
{
    public override ConcreteSomething foobar
    {
        get
        {
            return new ConcreteSomething();
        }
    }
}

【讨论】:

    【解决方案2】:

    不使用泛型是否可以做到这一点?

    不。使用泛型:

    public abstract class A<T>
        where T : AbstractSomething
    {
        public abstract T foobar { get; }
    }
    
    public class B : A<ConcreteSomething>
    {
        public override ConcreteSomething foobar
        {
            get
            {
                return new ConcreteSomething();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用泛型指定它,尽管这确实使某些事情更难处理:

      public abstract class A<T> where T : AbstractSomething
      {
          public abstract T foobar {get;}
      }
      
      public class B : A<ConcreteSomething>
      {
          public override ConcreteSomething foobar
          {
              get
              {
                  return new ConcreteSomething();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        相关资源
        最近更新 更多