调用派生类

时间:2016-03-14 05:52:18

标签: c# .net oop inheritance

我有这5个类..一个叫做Figura的基类,它是一个抽象类,还有4个具体的派生类。

Classes

我必须创建一个大小为8的Figuras数组(两个Cuadrado,两个Rectangulo,两个Triangulo和两个Circulo),所以我这样做了:

Figuras[] figuras = new Figuras[8];
figuras[0] = new Cuadrado(1);
figuras[1] = new Cuadrado(2);
figuras[2] = new Rectangulo(2, 1);
figuras[3] = new Rectangulo(6, 2);
figuras[4] = new Triangulo(1, 2, 2);
figuras[5] = new Triangulo(3, 3, 4);
figuras[6] = new Circulo(1);
figuras[7] = new Circulo(4);

然后我遍历数组来计算每个数字的面积和周长。当我尝试调用仅属于图Circulo的方法calcularDiametro()时出现问题。我怎么能这样做?

我尝试了以下但是它没有用。

foreach (Figuras f in figuras)
    if (f is Circulo)
        f.calcularDiametro();

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:4)

您需要将其转换为Circulo才能调用Circulo - 具体方法:

foreach (Figuras f in figuras) 
{
    if (f is Circulo)
        (Circulo)f.calcularDiametro();
}

请注意,这有点浪费,因为它会进行两次类型检查(这是一项代价高昂的操作)。不浪费的一种方法是使用as

foreach (Figuras f in figuras) 
{
    Circulo circ = f as Circulo;
    if (circ != null)
    {
        circ.calcularDiametro();
    }
}

答案 1 :(得分:4)

您可以使用as opertor并阻止其他演员并提高效果

foreach (Figuras f in figuras)
{
    var c = f as Circulo;
    if (c != null)
        c.calcularDiametro();
}

您还可以使用OfTypeEnumerable

中获取特定类型的对象
foreach (var c in figuras.OfType<Circulo>())
{
    c.calcularDiametro();
}

答案 2 :(得分:1)

其他答案在技术上是正确但错误的。您的问题是您不应该首先从类外部启动这些计算。类本身应该根据需要在构造函数中执行计算,或者在外部组件请求perimetro或diametro的值时执行计算。这就是封装。