Kishor-KW Ответов: 2

В чем практическая польза виртуального? Просто для достижения привязки времени выполнения или это означает больше, чем это


что такое использование привязки времени выполнения? я имею в виду не определение, а практическое преимущество

Что я уже пробовал:

public class Base
{
  public virtual void SomeMethod()
  {
  }
}

public class Derived : Base
{
  public override void SomeMethod()
  {
  }
}

...

Base d = new Derived();
d.SomeMethod();

он вызовет метод производного класса. но зачем это нужно. если я могу сделать это, создав экземпляр класса derivd. и объявление метода базового класса как запечатанного.

я могу кодировать вот так

public class Base
{
  public virtual void SomeMethod()
  {
  }
}

public class Derived : Base
{
  public override void SomeMethod()
  {
  }
}

...

Derved d = new Derived();
d.SomeMethod();

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

public class Base
{
  public virtual void SomeMethod()
  {
  }
}

public class Derived : Base
{
  public override void SomeMethod()
  {
  }
}

...

Derived d = new Derived();
d.SomeMethod();  //it will called derived method

base b=new base();
b.somemethod(); //it will call base method




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

2 Ответов

Рейтинг:
2

OriginalGriff

Цитата:
я могу сделать это, создав экземпляр класса derivd. и объявление метода базового класса как запечатанного.

Если вы сделаете это, вы не сможете создать производный класс-a sealed класс-это тот, который специально не могу быть использованным в качестве основы, он не может быть унаследован от.
Цитата:
он будет называться базовым классом, а также методами производного класса.

Нет, это не так: поскольку вы переопределили метод базового класса, он вызовет "последний" метод.
И если вы сделаете это:
Derived d = new Derived();
d.SomeMethod();
Base b = new Base();
b.SomeMethod();
b = d;
b.SomeMethod();
Он вызовет производный метод, затем базовый метод, затем производный метод.

То virtual ключевое слово сообщает компилятору, что производный класс мочь переопределите метод. Если вы опустите его, вы не сможете использовать override в определении метода производного класса.


Kishor-KW

"я могу сделать это, создав экземпляр класса derivd. и объявление метода базового класса как запечатанного."
я говорю, что метод должен быть запечатанным, а не классом.

Производный d = новый производный();
д. Метода someMethod();
База b = новая база();
б. какой-то метод();

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

"Ключевое слово virtual сообщает компилятору, что производный класс может переопределить метод. Если вы опустите его, вы не сможете использовать переопределение в определении метода производного класса."

а что, если я ничего из этого не использовал? и в чем преимущества его использования?

Рейтинг:
0

Midi_Mick

Его лучший вариант использования - абстракция - вам не нужно знать, что такое производный класс, чтобы получить правильный метод. Классический пример, который я люблю использовать, - это базовый класс транспортного средства с абстрактным (который является просто виртуальным, который не определен в базовом классе) int GetWheels (). Велосипед, производный от транспортного средства, имеет 2 колеса. У автомобиля их 4, а у фургона-6. Шиномонтажная мастерская регистрирует автомобиль и должна знать, сколько шин. Он может просто вызвать GetWheels на транспортном средстве и узнать, сколько шин потребуется, еще не зная, что это за транспортное средство.