2016-01-08 3 views
0

Я хочу hide the parent class method for the the child class object. Мой Круг отображения объекта два метода ко мне, когда я собираюсь открыть что методы:Как скрыть метод родительского класса из объекта дочернего класса?

enter image description here

enter image description here

Здесь objShape является объект класса Shape, который является абстрактным классом ,

Я хочу скрыть метод, который отображается на втором изображении.

Здесь класс Circle расширяет класс Oval, а класс Oval расширяет класс Shape.

кодирования класса 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); 

    } 

Овальный класс Coding

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; 
     }  
    } 

Circle Код класса

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. На втором изображении отображается предложение, и я могу использовать этот метод, но я не хочу этого предложения, и я не хочу использовать этот метод с объектом класса Circle.

+0

@ ун-удачливы Хорошо, но как я могу осуществить это? Я также хочу создать объект для класса Oval. –

+0

@ un-lucky, И мне также нужно расширить класс Oval для класса Circle. –

+0

@ un-lucky - запечатанный класс - это НЕ путь сюда. – ChrisF

ответ

7

In 2nd image it display the suggestion and I can use that method, but I don't want that suggestion and I don't want use that method with Circle class object.

Тогда вы не должны делать 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) 
    { 
    } 
} 
+0

И, конечно же, они оба наследуют от 'Shape', имеющих' public abstract double Area {get; } '. То же самое для «Perimeter». –

+0

@ ИванСтоев: Да. Добавлю это. –

+0

Я хочу передать параметр с помощью метода 'Area' и' Perimeter'. Как вы знаете, для Circle нужен только один аргумент «Радиус» и «Овал» нужны два аргумента «Малые оси» и «Основная ось». Это возможно и с моим классом. И мне также нужна такая же иерархия наследования. –

0

Просто Окружность наследуют форму, в отличие от овальной формы, если вы не хотите, овальные методы, предоставляемые по кругу.

+0

Мне нужна такая же иерархия наследования. Я не хочу, чтобы круг расширял класс Shape. Если я сделаю так, чтобы метод Area класса Circle два аргумента. Я также не хочу давать два аргумента методу Area класса circle. –

0

Это можно сделать, изменив спецификатор доступа методов класса Shape и Oval для защиты.

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; 
     } 
    } 

This will look like

Я думаю, что это то, что вы ищете ..

+0

Нет, это невозможно. У меня также есть класс Rectangle, который расширяет класс Shape. И если я это сделаю, я получил ошибку: 'Ошибка \t 'Shape.Shape.Area (double, double)' недоступен из-за уровня защиты' –