我希望hide the parent class method for the the child class object.
当我要访问这些方法时,我的Circle对象会向我显示两种方法:
这里objShape
是Shape类的对象,它是抽象类。
我想要隐藏在第二张图像上显示的方法。
这里Circle类扩展了Oval类,而Oval类扩展了Shape类。
形状类编码
abstract public class Shape
{
public abstract double Area(double dNum1 = 0.0, double dNum2 = 0.0);
public abstract double Perimeter(double dNum1 = 0.0, double dNum2 = 0.0);
}
椭圆课程编码
class Oval : Shape
{
public override double Area(double dNum1 = 0.0, double dNum2 = 0.0)
{
double dAns = Math.PI * dNum1 * dNum2;
return dAns;
}
public override double Perimeter(double dNum1 = 0.0, double dNum2 = 0.0)
{
double dTmp1, dTmp2, dAns;
dTmp1 = 2 * (dNum1 * dNum1);
dTmp2 = 2 * (dNum2 * dNum2);
dAns = (Math.PI / 2) * Math.Sqrt(dTmp1 + dTmp2);
return dAns;
}
}
圈子类代码
class Circle : Oval
{
public double Area(double dNum1)
{
double dResult = base.Area(dNum1, dNum1);
return dResult;
}
public double Perimeter(double dNum1)
{
double dAns = base.Perimeter(dNum1, dNum1);
return dAns;
}
}
那么,在这里我如何隐藏对Circle类对象的Oval类方法的直接访问。在第二个图像中显示建议,我可以使用该方法,但我不想要这个建议,我不想在Circle类对象中使用该方法。
答案 0 :(得分:7)
在第二张图片中显示建议,我可以使用该方法,但我不想要这个建议,我也不想在Circle类对象中使用该方法。
那么你基本上不应该Circle
从Oval
派生出来。不要忘记拥有Oval
类型的变量是完全可以接受的,该变量在执行时具有引用Circle
实例的值:
Oval x = new Circle();
Console.WriteLine(x.Area(10, 20));
从根本上说,任何对基类有意义的操作都应该对派生类有意义,在一个合理的继承层次结构中。
如果要保留继承层次结构,则应考虑重新设计,使得radius等是对象的 state 的一部分,而不是作为参数传入。例如:
public abstract class Shape
{
public abstract double Area { get; }
public abstract double Perimeter { get; }
}
public class Oval
{
private double Width { get; }
private double Height { get; }
public override double Area { get { ... } };
public override double Perimeter { get { ... } };
public Oval(double width, double height)
{
Width = width;
Height = height;
}
}
public class Circle
{
public double Radius { get { return Height; } }
public Circle(double radius) : base(radius)
{
}
}
答案 1 :(得分:0)
如果您不希望椭圆形方法被圆圈暴露,那么让Circle继承形状而不是椭圆形。
答案 2 :(得分:0)
您可以通过将Shape和Oval类方法的访问说明符更改为protected来实现此目的。
abstract public class Shape
{
protected abstract double Area(double dNum1 = 0.0, double dNum2 = 0.0);
protected abstract double Perimeter(double dNum1 = 0.0, double dNum2 = 0.0);
}
和
class Oval : Shape
{
protected override double Area(double dNum1 = 0.0, double dNum2 = 0.0)
{
double dAns = Math.PI * dNum1 * dNum2;
return dAns;
}
protected override double Perimeter(double dNum1 = 0.0, double dNum2 = 0.0)
{
double dTmp1, dTmp2, dAns;
dTmp1 = 2 * (dNum1 * dNum1);
dTmp2 = 2 * (dNum2 * dNum2);
dAns = (Math.PI / 2) * Math.Sqrt(dTmp1 + dTmp2);
return dAns;
}
}
我认为这就是你要找的......