2014-01-24 2 views
3

У меня есть этот интерфейсИнтерфейсы и реализации разделяемой

public interface IColumn 
{ 
    bool IsVisible {get;set;} 

    bool IsGroupBy { get; set; } 

    Type CLRType { get; set; } 

    string GetGroupByString(); 

    string GetFilterString(); 
} 

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

для string GetGroupByString(); осуществления представляет собой то же самое для всех классов, кроме 2

так я сделал абстрактный класс ColumnBase который наследует интерфейс IColumn и реализует весь его членов и добавил отступающие поля, потому что мне нужно реализовать INotifyPropertyChanged.

и сделал мои классы наследованием от ColumnBase, и я сделал переопределение импментаций, которые не должны быть одинаковыми.

У меня очень ограниченный опыт работы с интерфейсами и абстрактными классами, мой вопрос в том, есть ли у вас интерфейс и некоторые классы, которые наследуют его, и вы поняли, что реализация для некоторых, но не для всех свойств и функций одинакова, вы создаете абстрактный класс и ставите реализацию по умолчанию и переопределяете его внутри классов, имеющих специальную реализацию?

+3

Да, это похоже на хорошее решение. Отметьте методы, которые вы разрешите переопределить как «виртуальные», и укажите конкретный тип подкласса в подклассах. –

+0

@JeroenVannevel, но какая разница делает виртуальный? – Kanka

+1

это предотвратит проблемы, скрывающие методы, в зависимости от того, насколько абстрактна ваша переменная. [Это] (http://msdn.microsoft.com/en-us/library/aa645767 (v = vs.71) .aspx) должно быть ясно. –

ответ

1

Это даст вам ответы на основе мнений и предпочтений.

IMHO, я думаю, что это лучше всего подходит для абстрактного класса с двумя методами, требующими, чтобы различные реализации были объявлены абстрактными методами; использование абстрактных методов означает, что реализации должны иметь реализацию этого метода.

public abstract class ColumnBase 
{ 
    public bool IsVisible { get; set; } 

    public bool IsGroupBy { get; set; } 

    public Type CLRType { get; set; } 

    public virtual string GetGroupByString() 
    { 
     return "base string"; 
    } 

    public abstract string GetFilterString(); 
} 

public class ConcreteColumn : ColumnBase 
{ 
    public override string GetGroupByString() 
    { 
     return "concrete string"; 
    } 

    public override string GetFilterString() 
    { 
     return "who owns the filter string?"; 
    } 
} 
+0

, но для строки GetGroupByString(); реализация одинакова для всех классов, кроме 2, что означает, что с приведенным выше я должен повторять одну и ту же реализацию внутри каждого класса снова и снова? – Kanka

+1

Он мог сделать это виртуальным, а затем переопределить его в других. –

+0

Отредактировал свой ответ, чтобы он дал понять –

1

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

Да, я бы сделал это exactly.Actually это своего рода цель из abstract классов и virtual/override features.In вашем случае я думаю, что вам не нужно IColumn интерфейс, вы можете использовать абстрактный class.And реализовать все общие методы внутри него, то, если вы хотите изменить поведение метода, переопределите его в вложенном классе.

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

1

Если производный класс некоторая специализированная версия базового класса, то это было бы хорошей идеей, чтобы наследовать его от базового класса, как class Rectangle : Shape. Вот почему производные классы - это все специализированные версии одной и той же вещи. Например, Rectangle и Circle являются по сути своей формой. Но рассмотрите возможность использования интерфейсов, если у вас есть разные объекты, и вы хотите иметь подобное поведение. Например, вы можете сериализовать Bird объект и Chair объекта, даже если у них есть только Name и Age свойства, это не очень хорошая идея, чтобы вывести их сформировать базовый класс, который имеет Name и Age свойства и Serialize() метода, потому что они разные вещи. Хотя реализация метода Serialize() была бы одинаковой в обоих из них, лучше иметь интерфейс ISerializable и реализовать его в обоих классах.

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