Подтвердить что ты не робот

С# - когда использовать public int virtual и когда просто использовать public int

Я работаю над учебником "Профессиональный ASP.NET MVC 3" Дж. Галлоуэя. В этом уроке Джон показывает нам, как создать музыкальный магазин MVC.

Я нахожусь в той части, где мы создаем классы CS для моделирования данных с использованием EF-кода.

I все примеры в книге public virtual int property {get; set; } используются без объяснений. Термин виртуальный заполняется КАЖДЫЙ.

В другом месте в Интернете я не видел термин виртуальный, используемый с какой-либо согласованностью.

Может кто-нибудь объяснить мне:

  • Цель термина "virtual" в данном конкретном контексте
  • Используется ли "виртуальный" ?
  • Почему некоторые люди используют "виртуальный" , а другие нет?
  • Почему некоторые люди используют "виртуальные" при определении внешних ключей?
  • Какова наилучшая практика использования термина "виртуальный" ?

Большое спасибо заранее

4b9b3361

Ответ 1

Чтобы действительно понять ключевое слово virtual, которое вы хотите прочитать в Полиморфизм вообще:

Полиморфизм часто упоминается как третий столп объектно-ориентированное программирование, после инкапсуляции и наследования. Полиморфизм - это греческое слово, которое означает "многообразное", и оно имеет два отдельные аспекты:

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

  • Базовые классы могут определять и реализовывать виртуальные методы, а производные классы могут переопределять их, что означает, что они предоставляют свои собственные определения и реализации. Во время выполнения, когда клиентский код вызывает, CLR просматривает тип времени выполнения объекта и вызывает что переопределение виртуального метода. Таким образом, в вашем исходном коде вы можете вызывать метод в базовом классе и вызывать версию производного класса метод, который должен быть выполнен.

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

Ответ 2

Может кто-нибудь объяснить мне:

  • Цель термина "виртуальный" в этом конкретном контексте

    Другие пользователи здесь хорошо ответили на это очень хорошие ссылки.

  • Используется ли "виртуальный" ?

    Это зависит. Иногда это необходимо, иногда это лишнее.

  • Почему некоторые люди используют "виртуальные", а другие нет?

    Они используют его, когда им это нужно, или когда они думают, что им может понадобиться.

  • Почему некоторые люди используют только "виртуальные" при определении внешних ключей?

    При определении внешних ключей для использования инструментами реляционного сопоставления объектов, такими как Entity Framework и NHibernate, часто требуется virtual, потому что эти инструменты ORM динамически создают новый класс, который наследуется от вашего класса. Эти классы "динамического прокси" переопределяют ваши свойства virtual, чтобы обеспечить дополнительное поведение, необходимое для поддержания согласованности внешнего ключа. В случае NHibernate все свойства (а не только внешние ключи) должны быть отмечены virtual. Это связано с тем, что динамические прокси-серверы NH добавляют настраиваемое поведение, чтобы определить, какие свойства вашей модели будут извлекаться из базы данных, а какие - не загружать.

  • Какова наилучшая практика использования термина "виртуальный" ?

    Используйте его, когда вы намерены переопределить член (метод или свойство) в более производном классе. Не используйте их в классах, отмеченных sealed.

Ответ 3

Итак, термин virtual, в основном, означает "overridable" (имеет базовую реализацию), но не абстрактный (что означает отсутствие оригинальной реализации).

Ключевое слово 'virutal' является обязательным, если вы хотите, чтобы кто-то переопределил ваш метод или свойство, вместо того, чтобы "скрыть" его.

Итак, все это относится к наследованию и полиморфизму. Производный класс может переопределить виртуальный метод и сделать его собственной реализацией (или даже вызвать базовую реализацию в этом методе). Посредством переопределения вы можете гарантировать, что ваш новый метод будет называться полиморфно, а не базовой.

Непосредственно, используя ключевое слово "новое", вы можете "скрыть" элементы данных и методы. Это также позволит вам выполнить свою собственную реализацию, но не выполняет вашу новую реализацию полиморфно, она будет использовать реализацию базового класса.

Virual Keyword

Версии с переопределением и новыми ключевыми словами (руководство по программированию на С#)

Ответ 4

Причина, по которой он использует виртуальное ключевое слово в своей модели, - включить Изменить прокси-серверы. Это нечто специфичное для Entity Framework (редактирование: также NHibernate и, возможно, любое другое orm thanks @danludwig), и это позволяет EF автоматически управлять сущностями, которые вы сопоставляете с базой данных.

Из MSDN:

Каждое свойство, которое сопоставляется с свойством типа сущности в модель данных должна иметь незапечатанную (NotOverridable в Visual Basic), открытый и виртуальный (Overridable in Visual Basic) получить и установить аксессоры.

Ответ 5

См. виртуальный (ссылка на С#) , Добавление ключевого слова virtual позволяет переопределить свойство в производных классах, что очень вероятно, когда вы создаете обобщенные базовые классы приложения MVC.

Ответ 6

Из документов

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

Итак, если вам нужно скрыть старые функции и добавить новый, вы можете использовать виртуальные. Для разных приложений требуется разница в соответствии с новыми модулями и архитектурой.

см. здесь http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

Ответ 7

Virtual гарантирует, что наследуемые дочерние классы переопределяют базовый класс, применяя их для переопределения свойства. Без него ключевое слово virtual, дочерний объект не может переопределить базовую функциональность.