В C # модификатор переопределения является обязательным в производном классе для виртуальных / абстрактных методов базового класса. - PullRequest
3 голосов
/ 16 августа 2011
public class Shapes
{
  public virtual void Color()
  {
    Console.WriteLine("Shapes");
  }
}

public class Square : Shapes
{
  public void Color()
  {
    Console.WriteLine("Square");
  }
}

public class Test
{ 
  public static void main()
  {
    Shapes s1 = new Shapes();
    s1.Color();
    Shapes s2 = new Square();
    s2.Color();
  }
}

Я хочу знать, если базовый класс определил некоторые методы виртуальными, то обязательно ли переопределять их в производном классе? Точно так же, если метод базового класса является абстрактным, нам нужно реализовать метод в производном классе, но является ли обязательным модификатор переопределения? Что делать, если модификатор переопределения опущен.

Ответы [ 4 ]

7 голосов
/ 16 августа 2011

Я хочу знать, определил ли базовый класс некоторые виртуальные методы, тогда обязательно ли переопределять их в производном классе?

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

Если метод базового класса является абстрактным, мыНужно реализовать метод в производном классе, но является ли обязательным модификатор переопределения?

Да, вам нужно использовать ключевое слово override, в противном случае метод будет скрыт определением в производном классе..

Если вы действительно запустите свой код, вы увидите, что «Фигуры» напечатаны дважды.Это потому, что метод Color() в классе Squares не объявлен с использованием ключевого слова override.Таким образом, скрывает метод базового класса.Это означает, что он будет доступен только через переменную типа Squares:

Sqares s3 = new Squares();
s3.Color();

Это выведет «Квадрат», так как вы вызываете метод для переменной правильного типа.

3 голосов
/ 16 августа 2011

Это полностью основано на вашей логике в первой части вашего вопроса. В классе Square, который является производным от класса Shapes, вы объявляете метод Color, который скрывает его родительский виртуальный метод Color, вам не нужно дублировать тот же метод в дочернем.Класс, когда он существует в своем родителе, за исключением случаев, когда вы хотите скрыть метод родительского класса.В абстрактном классе, если у вас есть виртуальный метод, вы должны реализовать или переопределить его в производных классах, при этом образцы этих Shapes будут вызывать виртуальный метод Color в классе Shapes.

3 голосов
/ 16 августа 2011

Как вы можете видеть из примера кода, который вы разместили, результат будет

Shapes
Shapes

Это потому, что, опуская ключевое слово override, вы по умолчанию скрываете базуметод класса - это означает, что метод больше нельзя использовать полиморфно - даже если s2 является экземпляром Square, так как ссылка на объект, используемая для вызова метода, - Shapes, используется метод Shapes.

Если метод помечен override, с другой стороны, он будет вызван даже для ссылок на объекты типа Shape, так как используется наиболее производный метод Color() в дереве наследования для данного экземпляра.

3 голосов
/ 16 августа 2011

Взгляните на эту ссылку , это может быть полезно.

Копия на этой странице:

Чтобы сделать метод виртуальным, *Модификатор 1008 * virtual должен использоваться в объявлении метода базового класса.Затем производный класс может переопределить базовый виртуальный метод с помощью ключевого слова override или скрыть виртуальный метод в базовом классе с помощью ключевого слова new.Если не указано ни ключевое слово override , ни ключевое слово new , компилятор выдаст предупреждение, а метод в производном классе скроет метод в базовом классе

...