Здравствуйте, 0x7be, Вы писали:
0>Здравствуйте, Sorc17, Вы писали:
S>>Это не объяснение Зачем-то же так сделали разработчики языков. Наверное они на какой-то науке основывали своё решение. 0>Ключевые слова для гугления: Information Hiding, Encapsulation.
Ага. Я вот буквально пару минут назад у своих друзяшек в google+ спросил, а только ли для инкапсуляции придумали такие вещи как private, final, protected? Или есть ещё какие-то глубокие и не очевидные причины.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Ага. Я вот буквально пару минут назад у своих друзяшек в google+ спросил, а только ли для инкапсуляции придумали такие вещи как private, final, protected? Или есть ещё какие-то глубокие и не очевидные причины.
А этих недостаточно?
Здравствуйте, Sorc17, Вы писали:
S>Вообще моя тема выросла из вопроса, как обосновать, что в коде нужно использовать ООП.
Мне кажется, что вопрос неправильный. Не надо спрашивать "как обосновать необходимость использования Х?", надо спрашивать "что здесь надо использовать?"
S>...Подобные вопросы похожи на болото, в них нет конкретики, меня это раздражает, казалось бы, в программировании сплошь и рядом точные науки, а тут такая лабуда получается.
Именно так. ООП — это вообще чистое ремесленничество, у него нет строгой формальной базы или хотя бы единого определения, что есть ООП. В итоге ООП больше напоминает религию со всем сопутствующим словоблудием.
Здравствуйте, 0x7be, Вы писали:
0>Здравствуйте, Sorc17, Вы писали:
S>>Ага. Я вот буквально пару минут назад у своих друзяшек в google+ спросил, а только ли для инкапсуляции придумали такие вещи как private, final, protected? Или есть ещё какие-то глубокие и не очевидные причины. 0>А этих недостаточно?
Ну вдруг есть ещё что-то о чём я даже не подозреваю, интересно же
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Интерфейсы — это просто классы без реализации. В Яве их вообще сделали в качестве костылика вместо множественного наследования. Ни какого другого смысла в них нет. Я не прав?
S>
S>class MyInterface {
S> void method(arg) {
S> system_exit("Сперва реализуй, а потом пользуйся, балбес!")
S> }
S>}
S>
S>Чем это не интерфейс?
abstract class MyInterface {
public abstract void method(arg);
}
Вот это — "почти" интерфейс. И, скорее всего, костыль, изобретенный на пути к "настоящим" интерфейсам.
Здравствуйте, Sorc17, Вы писали:
S>Интерфейсы — это просто классы без реализации. В Яве их вообще сделали в качестве костылика вместо множественного наследования. Ни какого другого смысла в них нет. Я не прав?
Интерфейсы это не просто классы без реализации, это именно интерфейсы. Они не имеют смысла без полиморфизма. ИМХО, одни из лучших применений интерфейсов — передача функциональности без передачи самого объекта, реализующего эту функциональность (некая ООП-замена передачи функций как аргументов в другие функции).
Допустим, пишете вы некий класс, который занимается обработкой какой-то хрени длительное время. Вероятно в отдельном потоке. И еще у вас есть какое-то окно, в котором отображаются прогресс бар, строка статуса и прочее. Я обычно определяю интерфейс вида
Класс окна наследует этот интерфейс и реализует его методы, в которых осуществляется работа с конкретными прогресс барами и т.д.
А класс, который занимается обработкой, при инициализации получает этот интерфейс для того, чтобы управлять окном, ничего не зная про само окно. В случае С++ это весьма полезно, так как достигается кроссплатформенность класса обработки, и вообще появляется некая универсальность, уменьшается завязанность отдельных частей кода и т.д.
Здравствуйте, Sorc17, Вы писали:
S>Ага. Я вот буквально пару минут назад у своих друзяшек в google+ спросил, а только ли для инкапсуляции придумали такие вещи как private, final, protected? Или есть ещё какие-то глубокие и не очевидные причины.
Только для инкапсуляции. Точнее, для возможности определять для одного и того же класса различные контракты по отношению к другому коду, в зависимости от того, что это за код. То есть protected позволяет классу выставлять наружу специальный контракт для наследников, не давая к нему доступа для посторонних. Набор этих "модификаторов доступа" зависит от структуры кода. В дотнете появляются сборки — и вместе с ними модификатор internal. В Delphi появляется отдельная сущность "визуальный дизайнер", и для него появляется модификатор published.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sorc17, Вы писали:
S>Интерфейсы — это просто классы без реализации. В Яве их вообще сделали в качестве костылика вместо множественного наследования. Ни какого другого смысла в них нет. Я не прав?
Формально прав. На практике же удобно когда есть способ описать интерфейс (в общем смысле этого слова) гарантированный не содержащий реализации. Так что в С++ я бы интерфейсы тоже ввел бы, не смотря на то, что физической необходимости в этом нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Sorc17, Вы писали:
S>>Интерфейсы — это просто классы без реализации. В Яве их вообще сделали в качестве костылика вместо множественного наследования. Ни какого другого смысла в них нет. Я не прав?
VD>Формально прав. На практике же удобно когда есть способ описать интерфейс (в общем смысле этого слова) гарантированный не содержащий реализации. Так что в С++ я бы интерфейсы тоже ввел бы, не смотря на то, что физической необходимости в этом нет.
Спасибо
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Интерфейсы — это просто классы без реализации. В Яве их вообще сделали в качестве костылика вместо множественного наследования. Ни какого другого смысла в них нет. Я не прав?
S>
S>class MyInterface {
S> void method(arg) {
S> system_exit("Сперва реализуй, а потом пользуйся, балбес!")
S> }
S>}
S>
S>Чем это не интерфейс?
На тебе упрощалку:
Интерфейс это как-бы абстрактная сигнатура объекта(класса), по аналогии с сигнатурой функции.
Вот и всё. Очевидно, что абстрактный корневой класс тоже обеспечивает общую сигнатуру для всех потомков. И множественное наследование обеспечивает общую сигнатуру для объектов.
Здравствуйте, Sorc17, Вы писали: S>Интерфейсы — это просто классы без реализации. В Яве их вообще сделали в качестве костылика вместо множественного наследования. Ни какого другого смысла в них нет. Я не прав?
интерфейсы это очень важное самостоятельное понятие
попробуй дать определение того, что такое пуговица.
не сможешь. правильное определение — все, что удовлетворяет интерфейсу пуговицы (соединить-разьединить), есть пуговица
Здравствуйте, Sorc17, Вы писали:
S>Интерфейсы — это просто классы без реализации. Никакого другого смысла в них нет.
Интерфейс, в отличие от большинства языковых средств, представляет собой некое анти-средство, намеренно ограничивающее функциональность. Как private, const и т. п. Служит для избежания ошибок и побуждения программиста следовать определенному подходу.
Я бы еще, продолжая в том же духе, запретил наследоваться от классов, только от интерфейсов. interface I2 extends I1, class C implements I1, I42, и всё.
Здравствуйте, Sorc17, Вы писали: S>Чем это не интерфейс?
Ничем. Ты розетку на стене, к которой комп подключен, видишь? Это реализация интерфейса. Знаешь нафига оно придумано? Чтобы ты засунул туда утюг? А вот фиг тебе, не угадал, для этого конкретная реализация розетки существует. Интерфейс описывают чтобы туда USB не прикрутил.
Всё, что нас не убивает, ещё горько об этом пожалеет.