【问题标题】:Return the same type as subclass calling a base method返回与调用基方法的子类相同的类型
【发布时间】:2021-12-30 08:43:37
【问题描述】:

一个非常简单的基类:

class Figure {
    public List<?> getList() {
        var list = new List<same as child>();
        //do some code
        //filling list
        return list;
    }
}

这个继承类:

class Rectangle : Figure
{
    
}
class Cube : Figure
{
    
}

我知道我可以像这样使用泛型:

class Figure {
    public List<T> getList<T>() {
        var list = new List<T>();
        //do some code
        //filling list
        return list;
    }
}

Rectangle rec = new Rectangle();
List<Rectangle> lRec = rec.getList<Rectangle>();

Cube cube = new Cube();
List<Cube> lCube = cube.getList<Cube>();

但我想知道是否有替代方案

像这样:

Rectangle rec = new Rectangle();
List<Rectangle> lRec = rec.getList();

Cube cube = new Cube();
List<Cube> lCube = cube.getList();

【问题讨论】:

  • 另一种方法,它有什么不同,为什么/你的目标是什么?
  • @CaiusJard 我不想每次调用方法时都写类型,因为总是与调用它的子类相同。
  • 这打破了SOLID 大时间.. 通常Factory 类用于此类任务

标签: c# inheritance


【解决方案1】:

如果你将类型参数约束到实现类 你会得到你想要的:

class Figure<T> where T : Figure<T>
{
    public List<T> getList()
    {
        var list = new List<T> ();
        //do some code
        //filling list
        return list;
    }
}

class Rectangle : Figure<Rectangle>
{

}
class Cube : Figure<Cube>
{

}

根据场景将getList标记为虚拟或抽象可能会派上用场

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2015-04-05
    相关资源
    最近更新 更多