2014-01-31 11 views
0

я прочитал статью с какой-либо сайт, и в этой статье я прочитал это:Абстрактный класс и интерфейс в C#

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

Я не понимаю, что это значит. Может кто-нибудь пояснить это точнее, с Хороший пример?

это статья, в которой я прочитал Link

+2

Представьте, что вы добавляете новый метод в интерфейс. Все разработчики должны быть обновлены, чтобы обеспечить их реализацию. И исходный, и двоичный. Теперь добавьте новый метод в абстрактный базовый класс. Ничего не нужно будет изменять (... более или менее ...) в производных классах. _Without destroying_ означает, что в этом случае абстрактный базовый класс будет поддерживать как исходную, так и двоичную совместимость с существующими кодами/сборками, а интерфейс будет разорвать (уничтожить ...) оба. –

+0

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

+0

@Adriano Правильный ответ ([Нет комментариев] (http://stackoverflow.com/help/privileges/comment) :-)) – pravprab

ответ

3

Поскольку интерфейсы определяют только члены, которые должны реализовывать типы, добавление любого нового элемента в интерфейс приведет к поломке любого класса, который реализует старую версию, поскольку он по сути не реализует новый элемент. Каждый раз, когда вы меняете определение интерфейса, вы должны изменить каждый класс, реализующий этот интерфейс. Добавление абстрактного элемента в абстрактный класс делает то же самое для производных классов, но если вы добавите виртуальный член в абстрактный класс, это не повлияет на производные классы. Их можно изменить, чтобы переопределить этот элемент, но им это не нужно.

2

Что это означает, что если вы считаете абстрактный класс под названием Телефон и имеет 3 виртуальные функции, т.е. AddPhonePrice, AddAccessoryPrice, AddAuxillaryPrice

и если есть два детских класса 1) SamsungPhone 2) Iphone

теперь SamsungPhone будет иметь реализацию для всех 3 функций. в то время как Iphone будет иметь реализацию только AddPhonePrice, так как они не обеспечивают что-нибудь еще с телефоном

если мы делаем интерфейс под названием IMainPhone с AddPhonePrice, AddAccessoryPrice, AddAuxillaryPrice функции

тогда как SamsungPhone и Iphone нужно будет реализовать все 3 функции независимо от того, нужны они им или нет.

1

Это означает, что вы можете добавлять новые члены (методы, свойства, поля, ...) в абстрактные классы, которые не приводят к изменениям в производных классах - если члены не абстрактны, это правильно , Например, рассмотрим следующий пример:

internal abstract class MyBaseClass 
{ 
    public abstract void DoSomething(); 

    // This method can also be added later without having an effect on the derived classes 
    public virtual void DoSomethingElse() 
    { 
     // Do something else... 
    } 
} 

internal class MyDerivedClass : MyBaseClass 
{ 
    public override void DoSomething() 
    { 
     // Do something... 
    } 
} 

В этом случае производный класс должен реализовать метод DoSomething. Но позже вы можете добавить не абстрактные функции в абстрактный базовый класс. Однако, как только вы добавляете еще один абстрактный элемент в базовый класс, это также влияет на все не абстрактные производные классы, потому что они должны внедрять новые члены.

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

0

Интерфейс: При добавлении методы к базовому классу интерфейса, то вы должны (вручную) убедитесь, что все получены классов реализации этого метода.

Аннотация Основание: При добавлении метод абстрактного класса база, вам не требуется компилятор для реализации этого метода в производного классов.

Смежные вопросы