【问题标题】:How to hide the parent class method from the child class object?如何对子类对象隐藏父类方法?
【发布时间】:2016-04-13 01:55:03
【问题描述】:

当我要访问这些方法时,我想hide the parent class method for the the child class object. My 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 类对象一起使用。

【问题讨论】:

  • @un-lucky 好的,但是我该如何实现呢?我还想为 Oval 类创建对象。
  • @un-lucky,我还必须为 Circle 类扩展 Oval 类。
  • @un-lucky - 密封的课程不是去这里的方式。
  • 显然你的接口/抽象类被破坏了。当有形状应该有一个基于两个参数的区域时,抽象中应该根本没有这样的方法,或者你的圆应该派生自其他类。

标签: c# .net oop c#-4.0


【解决方案1】:

在第二张图片中,它显示了建议,我可以使用该方法,但我不想要该建议,也不想将该方法与 Circle 类对象一起使用。

那么你不应该让Circle 派生自Oval,基本上。不要忘记拥有一个Oval 类型的变量是完全可以接受的,它在执行时有一个引用Circle 实例的值:

Oval x = new Circle();
Console.WriteLine(x.Area(10, 20));

从根本上说,任何对基类有意义的操作应该在合理的继承层次结构中对派生类也有意义。

如果你想保持你的继承层次,你应该考虑重新设计,使半径等成为对象的状态的一部分,而不是作为参数传入。例如:

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)
    {
    }
}

【讨论】:

  • 当然,它们都继承自Shape,具有public abstract double Area { get; }Perimeter 也一样。
  • @IvanStoev:是的。将添加。
  • 我想用AreaPerimeter方法传递参数。如您所知,Circle 只需要一个参数 Radius,而 Oval 需要两个参数 Minor AxesMajor Axis。这和我的班级设计是可能的。而且我也想要相同的继承层次结构。
  • @KalpeshRajai:那么你的设计就坏了——就这么简单。您不能将Circle 实例视为Oval,因此Circle 不应派生自Oval
  • @JonSkeet 好的,非常感谢您的帮助,顺便说一下,我是 c# 新手,也感谢您的书。这对开始学习 c# 有很大帮助。
【解决方案2】:

您可以通过将 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;
        }
    }

我想这就是你要找的东西..

【讨论】:

  • 不,那是不可能的。我也有扩展 Shape 类的 Rectangle 类。如果我这样做,我会得到错误:Error 'Shape.Shape.Area(double, double)' is inaccessible due to its protection level
【解决方案3】:

如果您不希望圆形暴露椭圆方法,只需让圆形继承形状而不是椭圆。

【讨论】:

  • 我想要相同的继承层次结构。我不想圈出来扩展 Shape 类。如果我这样做,那么 Circle 类的 Area 方法有两个参数。我也不想给圆类的 Area 方法两个参数。
猜你喜欢
  • 2017-07-22
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
相关资源
最近更新 更多