Толкование 1
В C# абстрактные и виртуальные формулы запутанны, оба связаны с наследованием и требуют использования переопределения. Давайте обсудим различия между ними:
1. Виртуальный метод
Виртуальное ключевое слово используется для модификации методов базового класса. Существует две ситуации, когда используется виртуальное использование:
Сценарий 1: Виртуальный метод определяется в базовом классе, но виртуальный метод не переписывается в производном классе. В вызове производного экземпляра класса виртуальный метод использует метод, определённый базовым классом.
Сценарий 2: Виртуальный метод определяется в базовом классе, после чего метод переписывается с помощью переопределения в производном классе. В вызове производного экземпляра класса виртуальный метод использует производный метод перезаписи.
2. Абстрактный метод (абстрактный метод)
Абстрактное ключевое слово можно использовать только в абстрактных классах для модификации методов, и отдельной реализации нет. Реализация абстрактных методов должна осуществляться с использованием ключевого слова override в производном классе.
Самое существенное отличие интерфейса от абстрактного класса: абстрактный класс — это неполный класс, абстракция объекта, а интерфейс — поведенческая норма.
3. Ключевые слова
Статичный: Когда метод объявлен статическим, он является статичным, и компилятор сохраняет реализацию метода на момент компиляции. То есть метод принадлежит классу, но не какому-либо члену, независимо от существования экземпляра класса или нет. Точно так же, как функция входа Static void Main, поскольку это статическая функция, её можно вызвать напрямую.
Virtua: Когда метод объявлен как виртуальный, он остаётся виртуальным до тех пор, пока вы не используете переменную ClassName = new ClassName(); Перед объявлением экземпляра класса он не существует в реальном пространстве памяти. Это ключевое слово очень часто используется в наследовании классов для поддержки полиморфизма для методов классов.
overrride: указывает на переписку. Этот класс наследует от класса Shape. Виртуальный, абстрактный — это сказать другим классам, которые хотят унаследовать от него, что ты можешь переопределить мой метод или свойство, иначе это запрещено. Аннотация: объявление абстрактного метода — это метод, который должен быть переопределен производным классом, который используется для наследования; Его можно рассматривать как воображаемый метод без реализации; Если класс содержит абстрактный метод, то класс должен быть определен как абстрактный класс, независимо от того, содержит ли он другие общие методы; Абстрактные классы не могут содержать субстанции.
a) Метод виртуальной модификации должен иметь реализацию метода (даже если это всего лишь пара скоб), и метод абстрактной модификации не может иметь реализацию.
b) virtual можно переписывать подклассами, абстрактные — подклассами.
c) Если функция в классе модифицируется абстактом, имя класса также должно быть изменено с абстактом
d) Абстрактные модифицированные классы не могут быть созданы экземплярами.
e) Если метод на C# готов переписать родительский класс в подклассе, метод должен быть изменен с виртуальным в родительском классе и овериде в подклассе, чтобы программист не переписал родительский метод родительского класса в подклассе.
Примечание: классы, модифицированные с помощью абстрактных, могут быть только наследованы, а не инстанцированы.
Толкование 2
Для модификации родительского класса используются как виртуальный, так и абстрактный, что позволяет переопределить дочерний класс путём переопределения определения родительского класса.
У них есть одна общая черта: если они используются для модификации методов, перед ними должны быть добавлены публичные методы, иначе будут ошибки компиляции: виртуальные методы или абстрактные методы не могут быть приватными. В конце концов, добавление виртуального или абстрактного позволяет переопределить подкласс, и приватные члены не могут быть доступны подклассом.
Но они очень разные. (виртуальное — это «виртуально», абстрактное — «абстрактное»).
(1) Метод виртуальной модификации должен быть реализован (даже если он добавляет только пару скоб), тогда как метод абстрактной модификации не должен быть реализован. Например, если метод виртуальной модификации не реализован:
Ошибка: «Test1.fun1()» должен объявить тело, потому что оно не помечено как абстрактное, внешнее или частичное
Для абстрактных модификаторов, если реализованы:
Ошибка: "Test2.fun2()" не может объявить тело, так как оно отмечено как абстрактное
(2) виртуальные могут переписываться подклассами, а абстрактные — подклассами.
При компиляции нет ошибки: если метод виртуального модификатора переписан, перед ним нужно добавить переопределение (что сообщает компилятору о необходимости переписать виртуальный метод), и должна быть реализация, иначе компиляция будет ошибочной:
(3) Если член класса изменяется абстрактным, абстрактное должно быть добавлено перед классом, поскольку только абстрактные классы могут иметь абстрактные методы.
(4) Экземпляры абстрактных классов не могут быть созданы, их можно только наследовать и не могут быть инстанцированы, например: BaseTest2 base2 = новый BaseTest2(); Возникает ошибка компиляции: Абстрактный класс или интерфейс не могут создать экземпляр.
(5) В C#, если вы хотите переписать метод в подклассе, нужно добавить virtual перед родительским методом и переопределить перед подклассом, чтобы программисты случайно не переписали родительский метод в подклассе.
(6) Абстрактный метод должен быть перезаписан, а виртуальный метод должен иметь реализацию (даже если это метод, определённый в абстрактном классе).
Толкование 3 Сходства: 1. Все они могут передаваться по наследству 2. Ни один из них не может быть реализован 3. Он может содержать объявления методов 4. Производные классы должны реализовывать нереализованные методы Отличать: 1. Абстрактные базовые классы могут определять поля, атрибуты и реализации методов. Интерфейсы могут определять только атрибуты, индексаторы, события и объявления методов и не могут содержать поля. 2. Абстрактный класс — это неполный класс, который требует дальнейшей доработки, а интерфейс — это поведенческая норма. Пользовательские интерфейсы Microsoft всегда сопровождаются полем, чтобы доказать, что они являются выражением «Я могу это сделать...» ” 3. Интерфейсы могут реализовываться несколько раз, а абстрактные классы могут наследоваться только одним человеком 4. Абстрактные классы более определёны между рядом тесно связанных классов, тогда как большинство интерфейсов слабо связаны, но все реализуют определённую функцию 5. Абстрактные классы — это понятия, абстрагированные из ряда связанных объектов, поэтому они отражают внутреннюю общность вещей; Интерфейс — это функциональная конвенция, определённая для удовлетворения внешних вызовов, то есть отражает внешние характеристики объектов 6. Интерфейс по сути не обладает конкретными характеристиками наследования, он лишь обещает метод, который можно вызвать 7. Интерфейс может использоваться для поддержки обратных вызовов, но наследование не обладает этой функцией 8. Конкретные методы, реализуемые абстрактными классами, по умолчанию являются виртуальными, но методы интерфейса в классе, реализующие интерфейс, по умолчанию не виртуальные, конечно, их также можно объявить виртуальными 9. Если абстрактный класс реализует интерфейс, метод в интерфейсе может быть сопоставлен с абстрактным классом как абстрактный метод без необходимости его реализации, но метод в интерфейсе может быть реализован в подклассе абстрактного класса Правила использования: 1. Абстрактные классы в основном используются для тесно связанных объектов, тогда как интерфейсы лучше всего применяются для предоставления общей функциональности для нерелевантных классов 2. Если вы хотите спроектировать большой функциональный блок, используйте абстрактные классы; Если хотите проектировать небольшие, лаконичные функциональные блоки, используйте интерфейсы. 3. Если ожидается создание нескольких версий компонента, создайте абстрактный класс. Как только интерфейс создан, его нельзя изменить. Если требуется новая версия интерфейса, необходимо создать полностью новый интерфейс. 4. Если созданная функция будет использоваться между широким спектром гетерогенных объектов, используйте интерфейс; Если вы хотите предоставить единую реализованную функциональность для всех реализаций компонента, используйте абстрактные классы. 5. Проанализировать объект, уточнить внутреннюю общность, чтобы сформировать абстрактный класс, который используется для выражения сущности объекта, то есть «что». Интерфейсы придаются приоритету, когда необходимо расширить внешние вызовы или функции 6. Хорошее определение интерфейса должно быть конкретным и функциональным, а не многофункциональным, иначе это вызовет загрязнение интерфейса. Если класс реализует только одну функцию интерфейса, но должен реализовать другие методы в интерфейсе, это называется загрязнением интерфейса 7. Старайтесь избегать использования наследования для достижения функции формирования, но используйте мультиплексирование чёрного ящика, то есть комбинирование объектов. Из-за увеличения количества уровней наследования самым прямым следствием является то, что при вызове класса в этом таксоне приходится загружать их все в стек! Последствия можно представить. (В сочетании с пониманием принципа стека). В то же время заинтересованные друзья могут заметить, что Microsoft часто использует метод комбинирования объектов при создании класса. Например, в asp.net класс Page обладает свойствами, такими как Server Request, но на самом деле все они являются объектами определённого класса. Использование этого объекта класса Page для вызова методов и свойств других классов — это очень базовый принцип проектирования Например: Оконные формы можно проектировать с помощью абстрактных классов, а публичные операции и свойства помещать в абстрактный класс, чтобы форма и диалоговое окно могли наследовать от этого абстрактного класса, а затем расширяться и совершенствоваться в соответствии со своими потребностями.
Операция печати может быть предоставлена как интерфейс для каждой формы, которая нуждается в этой функции, поскольку содержимое формы отличается, и они должны реализовать свою собственную функцию печати в соответствии со своими требованиями. При печати он вызывается только через интерфейс, независимо от того, какая форма печатается.
Общность, индивидуальность и выбор: В некоторых книгах говорится, что C# рекомендует использовать интерфейсы вместо абстрактных базовых классов, и подчеркивают многочисленные преимущества использования интерфейсов, с которыми я не осмелюсь не согласиться; из приведённого выше списка между ними всё ещё много различий, и их существование должно определять разницу в применимых сценариях, например, в абстрактном базовом классе можно предоставить стандартные реализации для некоторых методов, чтобы избежать повторной реализации в подклассах и повысить повторимость кода. Это преимущество абстрактных классов; Интерфейс может содержать только абстрактные методы. Что касается того, когда использовать абстрактные базовые классы, а когда — интерфейсы, это зависит от того, как пользователи воспринимают связи между унаследованными классами — будь то различия личности или общие связи между ними. Позвольте привести пример из жизни.
Если вам дадут три объекта — люди, рыбы и лягушки, и вас попросят спроектировать для них базовую категорию, чтобы резюмировать связь между ними, то первое, что вы почувствуете — это большие различия между ними, и сложно абстрагировать общие черты. Здесь стоит рассмотреть использование интерфейсов вместо абстрактных базовых классов по трём причинам:
1. Индивидуальность важнее общего. 2. Личности с большими отличиями обладают похожим поведением. 3. Существуют большие различия в методах реализации одного и того же поведения. В этот момент вам дают ещё три объекта — карас, карп и золотые рыбки, и всё равно можно разработать базовые классы, чтобы обобщить связь между ними. Первое, что вы понимаете — все они принадлежат рыбам, а во-вторых, способ их плавания может немного отличаться, поэтому следует использовать абстрактные базовые классы вместо интерфейсов. По сравнению с приведённым примером есть три причины:
1. Общность выше индивидуальности 2. Особи с одинаковыми сходствами должны обладать одинаковыми качествами и поведением 3. Существуют определённые различия в методах реализации одного и того же поведения Среди множества причин использования интерфейсов или абстрактных базовых классов третья причина на самом деле та же: она описывает концепцию полиморфизма в объектно-ориентированном, то есть реализуется путём переопределения родительского класса и вызова соответствующего метода во время выполнения в зависимости от переданного объектного ссыла. Вторая причина начинает расходиться: интерфейсы подчеркивают одинаковое поведение между наследуемыми объектами, тогда как абстрактные классы также подчеркивают те же свойства между наследуемыми объектами. Что действительно отличает интерфейсы от абстрактных базовых классов — это следующие причины:
Интерфейсы используются при поиске функциональной общности между объектами с большими отличиями. Абстрактные базовые классы используются, когда рассматриваются функциональные различия между объектами с более общим уровнем. Сравнивая одинаковые и разные, можно только сказать, что интерфейсы и абстрактные классы имеют свои сильные стороны, но преимуществ нет. В реальной практике программирования нам нужно оценивать наши таланты в зависимости от конкретной ситуации, но следующий опыт и накопление могут дать вам вдохновение, помимо моего накопления, многие из них взяты из классики, я считаю, что они выдержат испытание. Так что в правилах и случаях, когда мы изучаем эти классические вещи, самое главное — применять то, чему мы научились, конечно, я завоюю смех всех словами семьи, пожалуйста, продолжайте.
Правила и случаи: 1. Помните, что одним из важнейших принципов объектно-ориентированного мышления является интерфейсно-ориентированное программирование. 2. С помощью интерфейсов и абстрактных классов многие идеи из 23 шаблонов дизайна были умело реализованы, и я считаю, что их суть просто в том, что они ориентированы на абстрактное программирование. 3. Абстрактные классы следует использовать преимущественно для тесно связанных объектов, а интерфейсы — для предоставления общей функциональности для нерелевантных классов. 4. Интерфейс сосредоточен на типе отношений CAN-DO, а абстрактный класс — на взаимоотношениях IS-A. 5. Поведение многоопределённых объектов в интерфейсе; абстрактные классы многократно определяют свойства объектов; 6. Определения интерфейсов могут использовать публичные, защищённые, внутренние и приватные модификаторы, но почти все интерфейсы определены как публичные, поэтому не нужно вдавать подробности. 7. «Интерфейс остаётся без изменений» — важный фактор, который следует учитывать. Поэтому при добавлении расширений из интерфейсов следует добавлять новые интерфейсы, а не существующие. 8. Попробуйте спроектировать интерфейс в функциональный блок с одной функцией, взяв пример .NET Framework, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable и т.д. — все они содержат только один общий метод. 9. Заглавная буква «I» перед названием интерфейса — это традиция, так же как название поля начинается с подчёркивания, пожалуйста, придерживайтесь этих принципов. 10. В интерфейсе все методы по умолчанию становятся публичными. 11. Если ожидаются проблемы с версиями, можно создать «абстрактный класс». Например, если вы создаёте собаку, курицу и утку, стоит подумать о абстрагировании животных, чтобы справиться с тем, что может возникнуть в будущем. Добавление новых членов в интерфейс требует изменения и перекомпилирования всех производных классов, поэтому задачи версии лучше реализовать с помощью абстрактных классов. 12. Неабстрактные классы, полученные из абстрактных классов, должны включать все унаследованные абстрактные методы и реальные реализации абстрактных аксесоров. 13. Новое ключевое слово не может использоваться для абстрактных классов и не может быть запечатано, поскольку абстрактные классы не могут быть созданы. 14. Статические или виртуальные модификаторы не могут использоваться в объявлениях абстрактных методов.
|