1 / 1 / 6
Регистрация: 08.05.2013
Сообщений: 136
|
|
1 | |
ООП, понимание абстрактных классов/методов и т.п12.04.2018, 11:44. Показов 4866. Ответов 9
Метки нет (Все метки)
Работаю программистом и столкнулся с тем, что на проекте отказались от абстрактного класса в пользу интерфейса, но я не совсем понимаю зачем.
Собственно такой вопрос: есть ли книги/статьи где можно почитать о таких вещах, как абстрактный класс/статическая функция/интерфейс/абстрактная функция и т.д.? Или у меня пробел в основах ООП и мне нужна литература для начинающих?
0
|
12.04.2018, 11:44 | |
Ответы с готовыми решениями:
9
Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов) Переопределение абстрактных методов Защита абстрактных методов Delphi. Использование абстрактных методов |
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
12.04.2018, 12:10 | 2 |
Сообщение было отмечено Headmaster как решение
Решение
Мода такая. Глюпая мода. Боятся распиаренной неосилянтами проблемы наследования ромбом, поэтому предпочитают кучу раз переписывать один и тот же код. При том что в языке оригинала оно не "ромбом" а "бриллиантом", и свое название оправдывает в случае грамотного применения. Ну или все на COM. Классы из DLL экспортируются только через интерфейсы, но опять же это ни как не мешает наследованию живущих в одном dll классов, реализующих интерфейсы.
Там читать то особо нечего. Абстрактный метод - виртуальный метод не имеющий реализации, и соответственно требующий его реализации в потомках. Абстрактный класс - класс содержащий абстрактные методы (не может быть создан объект такого класса в следствие отсутствия части методов, под них только место в VMT зарезервировано для потомков). Статический метод - объявлен как static и не связан с каким либо объектом класса. Соответственно не имеет доступа к нестатик полям/методам. Фактически глобальная функция в скопе класса (т.е. имеет доступ к закрытым статик-полям/методам). Интерфейс - тупо список абстрактных методов. не может иметь ни полей данных ни реализации каких либо методов, ни невиртуальных методов. т.е. крайний случай абстрактного класса. С использованием интерфейсов реализация и поля данных не наследуются, наследуется только список виртуальных методов. Посему использование интерфейсов вместо классов в 99% случаев глюпость.
1
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
12.04.2018, 14:03 | 3 |
Тут вопрос подхода. Существует теория, что наследование может быть двух типов - являться и уметь. При таком подходе, например, Собака является Животным и умеет Сторожить. Согласно этой теории объект может являться только чем-то одним и при этом соединять в себе произвольное количество свойств/черт. То есть, Собака не является Сторожем. Поэтому Собака наследует Животное и реализует уменеие Сторожить.
В ОО языках, которые придерживаются такого подхода, можно наследовать только от одного класса и реализовывать произвольное количество интерфейсов. Переписывать один и тот же код кучу раз не приходится, так как к интерфесам может быть призвязан обобщённый код. В разных языках используются разные механизмы призвязывания кода к интерфейсам. Обычно они называются mixins или traits (по фразе "a class can mix in any number of traits").
1
|
1 / 1 / 6
Регистрация: 08.05.2013
Сообщений: 136
|
|
12.04.2018, 22:10 [ТС] | 4 |
Очень понятно объяснено. Тогда ещё такую вещь как статический класс объяснить можете?
Добавлено через 6 минут А ещё, оказывается, метаклассы есть. Сколько же всего я не знаю
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
13.04.2018, 00:27 | 5 |
Статический класс может содержать только статические методы. Нельзя создать экземпляр такого класса.
з.ы. Вы на каком языке пишете? Терминология может немного отличаться.
1
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
13.04.2018, 08:23 | 6 |
Метакласс это структура данных содержащая описание класса. Обычно такие штуки на уровне фреймверка а не языка реализовываются. т.е. фактически список методов и свойств доступный для чтения из программы. Т.е. средство доступа к таблице рантайм-рефлекшин-информации сгененрированной компилятором для класса. Обычно имеет средства для вызова методов/установки/чтения свойств по символьному имени и/или номеру а так же создания экземпляра класса.
1
|
1 / 1 / 6
Регистрация: 08.05.2013
Сообщений: 136
|
|
13.04.2018, 12:09 [ТС] | 7 |
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
13.04.2018, 12:24 | 8 |
Статические классы нужны в языках типа C# и Java, где нельзя создать функцию вне класса.
В Python нет необходимости в статических классах, так как можно создавать функции прямо в модуле.
0
|
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
|
|
13.04.2018, 14:37 | 9 |
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
13.04.2018, 15:03 | 10 |
0
|
13.04.2018, 15:03 | |
13.04.2018, 15:03 | |
Помогаю со студенческими работами здесь
10
Не вижу абстрактных методов в классе BaseAdapter Список абстрактных классов Использование абстрактных классов Какое из следующих объявлений абстрактных методов абстрактного класса верно Поиск в массиве абстрактных классов Отличие Абстрактных классов от Интерфейсов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |