用具体类型覆盖抽象方法返回类型

时间:2013-12-11 15:12:23

标签: c# types return override abstract

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

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

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

编译器警告我,重写类型必须与基类型匹配。我对返回AbstractSomething的关注是我要求用户正确地转换返回的值。

实施我的getter最好的方法是什么?是否可以在不使用泛型的情况下执行此操作?

3 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:3)

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

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 :(得分: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();
        }
    }
}