动态转换父类到多个子类之一

时间:2013-10-11 18:17:15

标签: c#

所以我对编程很新,我试图看看是否有可能编写一个检查父类的方法来找到它的类型然后为任一结果执行相同的代码块。基本上我只是想看看是否有一种方法可以避免长时间if,否则if语句有多个不同的子类。

e.g。而不是

public Class Shape
public Class Circle : Shape
public Class Rectangle : Shape
public Class Polygon : Shape
....

Shape shape;

if(shape.GetType() == typeof(Rectangle))
{
    var asRectangle = (Rectangle)shape;
    doSomething();
}
else if (shape.GetType() == typeof(Circle))
{
    var asCircle = (Circle)shape;
    doSameSomething();
}
else if (shape.GetType() == typeof(Polygon))
{
    var asPoly = (Polygon)shape;
    doSame();
}

做类似的事情:

if (shape.GetType() == typeof(Rectangle)) var someShape = (Rectangle)shape;
else if (shape.GetType() == typeof(Circle)) var someShape = (Circle)shape;
else if (shape.GetType() == typeof(Polygon)) var someShape = (Polygon)shape;

method(someShape)
{
    doStuff...
}

我知道您不能像上面那样声明var,也不能这样做:

var dd;
if(something) var = whatever;

但我想知道是否有重复使用该方法而不必编写if,否则if if else if else if if语句每次我需要做一些形状。

3 个答案:

答案 0 :(得分:3)

在基类中声明一个方法virtualabstract,然后可以使用override关键字在派生类中再次声明它。这允许您将对象视为Shape并调用公共函数,但让它调用适当的方法,具体取决于实例实际所在的类。

public abstract class Shape
{
    public abstract void SayMyName();
}

public class Circle : Shape
{
    public override void SayMyName()
    {
        Console.WriteLine("I'm a circle!");
    }
}

public class Rectangle : Shape
{
    public override void SayMyName()
    {
        Console.WriteLine("I'm a rectangle!");
    }
}

public class Polygon : Shape
{
    public override void SayMyName()
    {
        Console.WriteLine("I'm a polygon!");
    }
}

然后你可以像这样消费它:

List<Shape> shapes = new List<Shape>(new Shape[]
{
    new Circle(),
    new Rectangle(),
    new Polygon(),
});

foreach (Shape s in shapes)
    s.SayMyName();

答案 1 :(得分:0)

通常,您可以将方法移动到Shape类中,然后调用它。如果方法为virtual(或abstract),则将调用派生类型中的实际版本。

这允许您根据自定义的需要,在ShapeoverrideRectangleCircle等内提供默认实施

有关详细信息,请参阅Virtual Methods on MSDN

答案 2 :(得分:0)

针对接口的程序,而不是实现。

也就是说,您应该编写代码以执行(主要)针对Shape基类/接口的操作,而不是针对特定类本身。换句话说,您不应该默认投射,而是仅在必要时投射。因此,如果您将Shape类作为接口实现,请执行以下操作:

abstract class Shape {
     public abstract Method() { ...}
}

然后你根本不需要进行投射,只需调用shape.Method(),它就适用于所有派生类。

此外,这样做更容易:

if (shape is Polygon)

而不是致电shape.GetType()