Re[2]: Проектирование: интерфейс vs абстрактный класс
От: boluba  
Дата: 01.07.06 17:22
Оценка:
Здравствуйте, lexius, Вы писали:

L>Если очень кратко:


L>абстрактный класс может содержать реализацию.Иногда это удобно.


L>Если приложение правильно проектируется с точки зрения ООП, то очень часто самый первый класс в цепочке наследования — абстрактный.

L>Все стальное — в посте выше, там более подробно.

Прощу прощения за расплывчатую формулировку. Вот здесь
Автор: boluba
Дата: 01.07.06
я попытался исправиться.
Re: Проектирование: интерфейс vs абстрактный класс
От: Pharod  
Дата: 01.07.06 23:01
Оценка: 4 (1) +1
Если работа идет с некой "недоменной" областью — то есть technology for technology — то как правило всегда использую только интерфейсы.
Если проектируется часть соотв. некой доменной области — простой подход такой:
Интерфейсы описывают в большей степени свойства объектов, в то время как классы — это is a отношение.
Абстрактный класс Cat это куда сильнее чем некий интерфейс Feedable. Интерфейсы позволяют описать некую общность поведения,
в то время как абстрактные классы это еще и общность состояний и свойств.
wbr,
Igor
Re[2]: Проектирование: интерфейс vs абстрактный класс
От: boluba  
Дата: 02.07.06 02:52
Оценка:
Здравствуйте, Pharod, Вы писали:

P>Если работа идет с некой "недоменной" областью — то есть technology for technology — то как правило всегда использую только интерфейсы.


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

P>Если проектируется часть соотв. некой доменной области — простой подход такой:

P>Интерфейсы описывают в большей степени свойства объектов, в то время как классы — это is a отношение.
P>Абстрактный класс Cat это куда сильнее чем некий интерфейс Feedable. Интерфейсы позволяют описать некую общность поведения,
P>в то время как абстрактные классы это еще и общность состояний и свойств.

Ваши аргументы приняты. Попробую уточнить вопрос.

Классический пример — "простой графический редактор". Идем по классическому пути: редактор работает с фигурами. Треугольник, круг, квадрат. Логично предложить их в качестве кандидатов в классы. Абстрактный класс Фигура тоже выглядить уместным.

Теперь добавим в редактор точку. Точка — это фигура? Или правильнее выделить интерфейсы Drawable, Resizeable, etc?

Как поступить на этапе анализа задачи?
Re[3]: Проектирование: интерфейс vs абстрактный класс
От: CatWarrior Россия www.gaolife.hut1.ru
Дата: 02.07.06 04:12
Оценка:
Здравствуйте, boluba, Вы писали:

B>Классический пример

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

Мне интерессно вот чего:
наследование абстрактного класса дороже чем наследование интерфейса ?
Re[3]: Проектирование: интерфейс vs абстрактный класс
От: Pharod  
Дата: 02.07.06 09:31
Оценка:
B>Классический пример — "простой графический редактор". Идем по классическому пути: редактор работает с фигурами. Треугольник, круг, квадрат. Логично предложить их в качестве кандидатов в классы. Абстрактный класс Фигура тоже выглядить уместным.

B>Теперь добавим в редактор точку. Точка — это фигура? Или правильнее выделить интерфейсы Drawable, Resizeable, etc?

B>Как поступить на этапе анализа задачи?

"правильнее" это нехорошее слово — проектирование ради проектирования удел тех, у кого много времени.
если перед вами стоит задача создать графический редактор — оцените требования.
если есть требование, к примеру, поддержать разные predefined фигуры в качестве плагинов — стройте фрэймворк
на интерфейсах, определяйте default behavior с помощью абстрактных имплиментаций.
если просто нужно уметь рисовать точки и три стандартные фигурки, обладающие 100% сходным поведением — думаю
подойдет абстрактный базовый класс вполне. является ли точка фигурой — вопрос сложный. тут опять нужны требования.
можно ли рисовать карандашом? использовать кисти? как раценивать нарисованную юзером карандашом кракозябру?
сильно зависит от того растровый ли это редактор или же векторный.
короче — смотреть детали, оценивать требования, не боятся ошибится. ну заэкстрактите вы потом интерфейсы если
назреет необходимость — чай не конец света :)
извините что так абстрактно отвечаю — но, как говорят, "правильно сформулированный вопрос содержит не менее 80% ответа" :)
и это все сугубо IMHO.
wbr,
Igor
Re[5]: Проектирование: интерфейс vs абстрактный класс
От: aefimov Россия
Дата: 03.07.06 05:52
Оценка:
Здравствуйте, boluba, Вы писали:

B>Тут можно спорить. Использование UnsupportedOperationException прямо и подробно описано в документации по Collections Framework. Насколько я понимаю, вы считаете, что раз уж класс реализует интерфейс (контракт), то должен его реализовывать (исполнять) полностью. Но если еще раз подумать, то выброс UnsupportedOperationException является неотемлемой частью контракта в данном контексте, не находите? На ваш взгляд было бы лучше вместо десятка интерфейсов и базовых реализаций иметь сотни конкретных частных решений, не выбрасывающих UnsupportedOperationException?


Я говорю не о конкретной реализации. Возможно тут Джошуа Блох и г-н Моринеску сделали все как посчитали нужным и правильным. Я лишь говорю, что они исказили "нормальность" использования абстрактных классов. По двум причинам.
1. Явно перегрузили методы интерфейса, сделав их абстрактными. (можно было просто ничего не писать и не путать этим следы)
2. Явно "реализовали" методы интерфейса, которые не используются в базовом функционале и реализованы так, что в рантайме (не не в компиляции) говорят о том, что они на самом деле не реализованы.

По этим двум пунктам я и говорил, что Collection Framework является плохим примером Interface -> Abstract Class -> Implementation Class.

Т.е. если абстрактный клас заявляет себя базовым, то он должен:
1. Не трогать методы интерфейса, которые он не собирается реализовывать в базовом варианте.
2. Реализовать методы интерфейса в базовом варианте по возможности с модификатором final!
3. При необходимости дополнения базовой фнкциональности он должен ввести дополнительные абстрактные методы с модификатором protected.

Замечу также, что оставление возможности перегрузки методов интерфейса реализованных в базовом абстрактном классе является также не очень хорошим примером. Потому, что в любой реализации можно изменить базовый функционал таким образом, а он меняться не должен.
Re[3]: Проектирование: интерфейс vs абстрактный класс
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 03.07.06 11:16
Оценка:
Здравствуйте, boluba, Вы писали:

B>Классический пример — "простой графический редактор". Идем по классическому пути: редактор работает с фигурами. Треугольник, круг, квадрат. Логично предложить их в качестве кандидатов в классы. Абстрактный класс Фигура тоже выглядить уместным.


Проектированию графического редактора было посвящено обсуждение "Параллельная иерархия классов" (см. здесь: http://www.rsdn.ru/Forum/?mid=1691851&flat=0
Автор: Дядюшка Че
Дата: 21.02.06
). Обратите внимание на это сообщение http://www.rsdn.ru/Forum/Message.aspx?mid=1699457&only=1
Автор: Кирилл Лебедев
Дата: 26.02.06
.

Относительно различий между интерфейсом и абстрактным классом. Ответ: с точки зрения проектирования нет никакой разницы. Различия чисто языковые, т.к. Java и C# не поддерживают множественного наследования.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: Проектирование: интерфейс vs абстрактный класс
От: mike_sikalo Украина  
Дата: 03.07.06 13:51
Оценка:
Здравствуйте, boluba, Вы писали:

B>Могли бы вы ответить на простой вопрос: В каких случаях при проектировании вы делаете выбор в пользу интерфейса, а в каких — в пользу абстрактного класса?


если я правильно интерпретирую канонические книги, то применять нужно всегда интерфейс
за исключением тех случаев, когда без наследования (кроме как большой кровью) не обойтись.
Re[2]: Проектирование: интерфейс vs абстрактный класс
От: boluba  
Дата: 03.07.06 15:57
Оценка:
Здравствуйте, mike_sikalo, Вы писали:

_>если я правильно интерпретирую канонические книги, то применять нужно всегда интерфейс

_>за исключением тех случаев, когда без наследования (кроме как большой кровью) не обойтись.

У Эккеля так написано в TIJ, если ничего не путаю.

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