我有这5个类..一个叫做Figura的基类,它是一个抽象类,还有4个具体的派生类。
我必须创建一个大小为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();
任何帮助都将不胜感激。
答案 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();
}
您还可以使用OfType
从Enumerable
foreach (var c in figuras.OfType<Circulo>())
{
c.calcularDiametro();
}
答案 2 :(得分:1)
其他答案在技术上是正确但错误的。您的问题是您不应该首先从类外部启动这些计算。类本身应该根据需要在构造函数中执行计算,或者在外部组件请求perimetro或diametro的值时执行计算。这就是封装。