3

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

例如,而不是

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、else if、else if、else if 语句。

4

3 回答 3

3

将基类中的方法声明为virtualor abstract,您可以在派生类中使用 override 关键字再次声明它。这允许您将对象视为 aShape并调用一个通用函数,但让它根据实例实际是哪个类调用适当的方法。

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();
于 2013-10-11T18:23:53.373 回答
0

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

这使您可以根据需要在、、 、Shape等内提供默认实现以进行自定义。overrideRectangleCirclePolygon

有关详细信息,请参阅MSDN 上的虚拟方法

于 2013-10-11T18:20:15.850 回答
0

针对接口而不是实现进行编程。

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

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

那么您根本不需要强制转换,只需调用shape.Method()它,它将适用于所有派生类。

这样做也更容易:

if (shape is Polygon)

比打电话shape.GetType()

于 2013-10-11T18:21:01.050 回答