Попытка получить реальную концепцию абстрактного класса против интерфейса в asp.net - PullRequest
6 голосов
/ 03 ноября 2011

Я просмотрел многочисленные сообщения S / O и не нашел ответа, который мне помог бы.
Я хотел бы получить мысленное представление о том, что такое абстрактный класс и что такое интерфейс.Я прочитал этот пост Простые примеры использования абстрактного класса в реальном мире , но я до сих пор не знаю, как это сделать.

Я надеюсь, что кто-то может описать реальный мир в форме объекта «Персона».Таким образом, наследование будет «Персона» -> «Сотрудник» -> «Менеджер»
А переопределение будет «Зарплата сотрудника» станет «Комиссия работника отдела продаж»

Как я могу описать абстрактный класси интерфейс в концепции объекта Person?

Ответы [ 3 ]

9 голосов
/ 03 ноября 2011

Существуют различные взгляды на предмет использования интерфейса по сравнению с абстрактным классом. Интерфейс, однако, должен выражать поведение объекта (что он может делать), а абстрактный класс должен определять, что это такое. В основном «я могу» против «я есть» с точки зрения объекта.

Итак, если у нас есть Person, это существительное, и поэтому мы будем использовать абстрактный класс для его определения. Любая вещь, которая является «Человеком», унаследует от этого класса. Если мы хотим определить какое-то поведение, которое описывает какое-то поведение, на которое способен Человек, которое не распространяется на всех Людей, мы должны поместить это в интерфейс.

Используя определенную вами связь (Person -> Employee -> Manager), мы можем сказать, что Employee реализует IFurable, а Manager - IFirer. Сотрудник может быть уволен, а менеджер может уволить сотрудника.

4 голосов
/ 03 ноября 2011

ОК, посмотрим, понял ли я ваш вопрос ...

Я думаю, что вы не уверены в различиях и / или сходствах между использованием интерфейсов и абстрактных классов. Если в этом проблема, то вот мое резюме "стартер для 10";

Абстрактные классы не могут быть созданы , , но могут содержать детали реализации , поэтому при получении класса из него вы получаете контракт и любое поведение по умолчанию, которое вы помещаете в абстрактный класс. Например, ваш класс Person (я предполагаю, что это абстрактный класс для этого примера) будет определять контракт, который должен (как минимум) иметь производный класс Employee или Manager, но также может обеспечивать некоторое поведение по умолчанию.

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

Также обратите внимание, что во многих языках (Java, C #, Delphi) вы можете наследовать только от одного родительского класса, но можете реализовать много интерфейсов.

4 голосов
/ 03 ноября 2011

Я прошу прощения, что я не использую ваш личный пример, пожалуйста, примите это как расширенный комментарий.

Мне проще всего объяснить концепции людям, не имеющим опыта программирования, используя аналогию с тем, что большинство людей уже понимают: литье пластмасс!

Допустим, мы делаем пластиковые фрукты, например:

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

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

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...