C#如何避免类型转换为子类?

JL.*_*JL. 4 .net c# subtyping

假设我有一个名为Shape的基类.然后是一些子类,如圆形和方形.

然后让我们在另一个名为GetShape的类中创建一个方法:

public Shape GetShape()
{
    return new Circle();  
}
Run Code Online (Sandbox Code Playgroud)

好吧,所以我的想法是,我可以传入一个shapeType,然后返回一个强类型的Shape子类.上面的例子是对实际代码的大规模简化,但我认为它得到了重点.

那么当我调用这个方法时它会是什么样子

var shapeCreator = new ShapeCreator();
Circle myCircle = shapeCreator.GetShape(); 
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它甚至不会运行,因为它需要一个演员表.

这实际上有效:

Circle myCircle = (Circle) shapeCreator.GetShape(); 
Run Code Online (Sandbox Code Playgroud)

关于那个演员,我并不狂热,我怎么能避免它,并且仍然有办法让一个方法返回一个基类,这样我就可以返回任何兼容的子类.

Pat*_*man 5

即使没有反射,您也可以使用泛型.此示例使用无参数构造函数过滤器T(从Adil更改的样本):

public T GetShape<T>() where T : Shape, new()
{
    return new T();
}
Run Code Online (Sandbox Code Playgroud)