Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Abstract class vs Interface


Автор: Exception 13.6.2006, 18:27
Столкнулся с вопросом при реализации паттерна Abstract Factory на C#. Какую языковую конструкцию предпочтительнее употребить для абстрактной фабрики - абстрактный класс или интерфейс? И вообще - когда что употреблять лучше? Хотелось бы услышать ваши домыслы по этму вопросу.  

Автор: sammix 13.6.2006, 19:29
Насколько я помню, абстрактные классы были давно, а интерфейсы являются новичками.
Даже само слово интерфейс как то больше по юзерски. Допустим юзеру нужно из класса какуюто определённую функциональность, тут интерфейс лучше, потому что юзер приводит класс к нужному ему интерфейсу, и получает список только нужной ему функциональности.
Ну а если класс создавался при использовании абстрактных классов, то юзер соответсвенно получит из класса целую кучу функциональности нужной и не нужной. При этом создаётся еффект мусора  smile 

Да и тем более класс может имплементить кучу интерфейсов, а наследовать только 1 класс. ( ну это я думаю вы знаете ).  

Автор: Exception 13.6.2006, 20:05
Это понятно. Вопрос - что предпочтительнее именно в данном случае:


Цитата(Exception @  13.6.2006,  19:27 Найти цитируемый пост)
при реализации паттерна Abstract Factory 


Добавлено @ 20:16 
Глянул сюда:
http://rsdn.ru/article/Patterns/AbstractFactory.xml

Тут интерфейс оказывается всё-таки удобнее ввиду возможного множественного наследования. 

Автор: Dark Wanderer 13.6.2006, 22:26
Простите за незнание, но что это за конструкция такая со "<>". Чё это вообще означает? 

Автор: Void 13.6.2006, 22:29
Dark Wanderer, читать http://msdn.microsoft.com/vcsharp/2005/overview/language/generics/ о дженериках. 

Автор: Dark Wanderer 13.6.2006, 22:36
Void, спасибо! 

Автор: VisualProgrammerNET 14.6.2006, 02:24
Никогда бы не подумал, что Exception что-то не знает...  smile  

Автор: ivashkanet 14.6.2006, 10:02
Пишу чисто мое ИМХО. Не читая никаких умных книжек и совсем не представляя что такое 
Цитата(Exception @  13.6.2006,  18:27 Найти цитируемый пост)
паттерна Abstract Factory на C#

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

P.S. А в принципе между ними вообще нет никакой разници (кроме отсутствия множественного наследования от абстрактного класса). 

Автор: Сарт 15.6.2006, 15:48
Вставлю свои 5 копеек фирмы Philips, продукция-чайник.
Насколько я понял
--интерфейс предлагает к наследованию ТОЛЬКО методы.
абстрактный класс же --не только методы но и другие вкусности.

--Интерфейс--наследовать сколько влезет,множественное наследие и прочее
Абстрактный класс-не прокатит множественное наследие=)

Так что подумай,что те нужнее--методы или методы+еще что то--и на основании этого делай выводы=). 

Автор: mr.DUDA 15.6.2006, 16:41
Цитата(Сарт @  15.6.2006,  15:48 Найти цитируемый пост)
--интерфейс предлагает к наследованию ТОЛЬКО методы.

А как же события и свойства ?  smile 

 

Автор: Exception 15.6.2006, 17:31
Цитата(Сарт @  15.6.2006,  16:48 Найти цитируемый пост)
Так что подумай,что те нужнее--методы или методы+еще что то--и на основании этого делай выводы=).  


Только методы. Но, с другой стороны,

Цитата(ivashkanet @  14.6.2006,  11:02 Найти цитируемый пост)
абстактный класс --- это некий каркас, на который потом одевается функциональность


что также присутствует.


Цитата(ivashkanet @  14.6.2006,  11:02 Найти цитируемый пост)
и совсем не представляя что такое 
Цитата(Exception @  13.6.2006,  18:27 )
паттерна Abstract Factory на C#


Учить паттерны, живо smile ! 

Автор: Сарт 15.6.2006, 17:37
Так я ж и сказал ---компания Philips, продукт-чайник=)) Что знал то посоветовал. 
P.S 
че за юмор--мессаги пишу,а кроличество этих мессаг не увеличивается?? сення во флейме точно больше 3-ех мессаг писал а как было 48 так и осталось=) 

Автор: mr.DUDA 15.6.2006, 17:45
Сарт, флеймовые не засчитываются

 smile  

Автор: Сарт 15.6.2006, 19:43
Ясно,сенкс=) 

Автор: ivashkanet 15.6.2006, 19:44
Цитата(Сарт @  15.6.2006,  17:37 Найти цитируемый пост)
 а как было 48 так и осталось=) 

Ты лучше расскажи как ты минус заработал  smile  

Автор: Сарт 15.6.2006, 21:59
да так,выкинул ссылку на страницу "На йух" . По ходу так=)) А вообще фиг его знает=) 

Автор: Exception 16.6.2006, 19:52
Модератор: Давайте вернёмся к теме обсуждения. 

Автор: VisualProgrammerNET 16.6.2006, 22:00
В основном использую абстрактные классы. А интерфейсы - только для того, что объединить некоторые из них в некое соответствие, которое можно было бы потом использовать в виде List<MyInterface> 

Автор: ivashkanet 16.6.2006, 22:25
Exception, а что ты еще хочешь???
Все кто мог уже свое мнение высказали. В остальном решать тебе. Что лучше использовать. 

Автор: Сарт 16.6.2006, 22:34
Ты расскажи что ты хочешь сделать тогда может и посоветуем=). Точнее ты хочешь подрубить много функция или подрубать эти функции к разным? 

Автор: VisualProgrammerNET 17.6.2006, 09:09
 smile 
Сарт, ты уж извини, но имхо ты навряд ли чем-то можешь помочь Exception'у  smile  

Автор: ivashkanet 17.6.2006, 10:42
 smile VisualProgrammerNET, извини, но это не наше дело кто как и чем пытается помочь.
Каждый помогает по мере сил. И если Сарт только начинающий программер, то это все равно ровным счетом ничего не значит.
ИХМО, спасибо, Сарт, за попытку помочь smile 
 

Автор: arilou 17.6.2006, 11:54
Цитата(Exception @  13.6.2006,  18:27 Найти цитируемый пост)
Столкнулся с вопросом при реализации паттерна Abstract Factory на C#. Какую языковую конструкцию предпочтительнее употребить для абстрактной фабрики - абстрактный класс или интерфейс? И вообще - когда что употреблять лучше? Хотелось бы услышать ваши домыслы по этму вопросу.  

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

Интерфейс отличается от абстрактного класса тем, что не содержит реализации методов, св-в, событий, только их описание. Говоря языком профессионалов ( smile шутка), интерфейс определяет контракт, по которому может работать какой-то класс.

Абстрактный класс тоже определяет контракт, но может содержать в себе реализацию некоторых методов, а реализацию других возложить на потомков.

smile  Не надо путать наследование и реализацию интерфейса. От интерфейсов не наследуются, их реализуют!  

Автор: ivashkanet 17.6.2006, 13:41
Цитата(arilou @  17.6.2006,  11:54 Найти цитируемый пост)
Интерфейс отличается от абстрактного класса тем, что не содержит реализации методов, св-в, событий, только их описание.

Чет я запутался  smile 
ИМХО, абстрактный класс то же не может содержать никаких реализаций методов.  smile  

Автор: arilou 17.6.2006, 13:45
ivashkanet, ты запутался  smile

Добавлено @ 13:46 
Тут "ИМХО" не может быть. 

Автор: Сарт 17.6.2006, 19:50
Может,насколько я помню=))

 

Автор: ivashkanet 18.6.2006, 14:09
Цитата(arilou @  17.6.2006,  13:45 Найти цитируемый пост)
ivashkanet, ты запутался
Цитата(Сарт @  17.6.2006,  19:50 Найти цитируемый пост)
Может,насколько я помню
 Действительно может  smile 

Наверное, все отличие интерфейсов от абстрактных классов и кроется тут:
Цитата(arilou @  17.6.2006,  11:54 Найти цитируемый пост)
Интерфейс отличается от абстрактного класса тем, что не содержит реализации методов, св-в, событий, только их описание.

Потому, что у меня прошла даже такая штука (полиморфизмом, вроде,  называется)
Код

class Program
    {
        static void Main(string[] args)
        {
            IMyWriteble[] mass = new IMyWriteble[2];
            mass[0] = new MyClass();
            mass[1] = new MyClass1();
            foreach (IMyWriteble i in mass) { i.write(); }
            Console.ReadKey();
        }
    }
    interface IMyWriteble { void write(); }
    class MyClass : IMyWriteble
    {
        public void write() { Console.WriteLine("It is a MyClass"); }
    }
    class MyClass1 : IMyWriteble
    {
        public void write() { Console.WriteLine("It is a MyClass1"); }
    }




 

Автор: Pitc 19.6.2006, 12:25
Цитата

Потому, что у меня прошла даже такая штука

А счего она должна не пройти? 

Автор: ivashkanet 19.6.2006, 12:52
С того, что я в такие дебри никогда не лез. Вот. (Опыт работы с .Net ~6 месяцев) 

Автор: Pitc 19.6.2006, 13:25
Цитата

 void write();
  
  i.write()

 public void write() { Console.WriteLine("It is a MyClass1"); }



Название методов в C# пиши с большой буквы.(нас за такое написание в универе драли не по детски) (т.е. public void Write())


arilou, могу добавить что в абстрактном классе могут содержтся не только абстрактные компаненты,  а в интерфейсе все компаненты являются неявно абстрактные, модефикатор доступа неявно public. 

Автор: ivashkanet 19.6.2006, 13:31
 smile Pitcеще раз наедешь, отдеру тебя  smile 
Этот пример был написан за 5 минут. 
Цитата(Pitc @  19.6.2006,  13:25 Найти цитируемый пост)
arilou, могу добавить что в абстрактном классе могут содержтся не только абстрактные компаненты,  а в интерфейсе все компаненты являются неявно абстрактные, модефикатор доступа неявно public. 

Что добавить??? Это же он сам и написал: 
Цитата(arilou @  17.6.2006,  11:54 Найти цитируемый пост)
Интерфейс отличается от абстрактного класса тем, что не содержит реализации методов, св-в, событий, только их описание

Или обдумывать прочитанное вас в универе не учили  

Автор: Pitc 19.6.2006, 13:40
Цитата

Что добавить??? Это же он сам и написал: 

Сморозил. Извиняюсь.  

Автор: mr.DUDA 19.6.2006, 20:21

 ! 
mr.DUDA
Не ссоримся, конструктивно дискутируем, излучаем позитивные эмоции :)
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)