C # Как реализовать интерфейс, где конкретные классы отличаются? - PullRequest
1 голос
/ 24 декабря 2010

Во-первых, извините за пустое название, но я не знаю хорошего заголовка для моего вопроса.

В моем приложении я использую критерии. Критерии можно рассматривать как элементы управления. У меня есть текстовые поля, а также переключатели и флажки.

Я использую интерфейсы для достижения этой цели:

ICriteria - это базовый интерфейс, от которого наследуются все классы критериев.

TextType наследуется от ICriteria. RadioType также наследуется от ICriteria. Но у RadioType должен быть выбор.

Оба типа, TextType и RadioType имеют некоторые одинаковые свойства.

Моя проблема в том, что я не знаю точно, как это реализовать. Я имею в виду, что я могу добавить некоторые методы и свойства в ICriteria, которые влияют на выбор, но тогда TextType должен также наследовать эти методы и свойства. Я не думаю, что это хорошо, потому что TextType не имеет выбора.

Каков наилучший способ реализовать это?

Ответы [ 3 ]

4 голосов
/ 24 декабря 2010

почему бы не использовать иерархию интерфейсов

public interface ICriteria
{
    void SomeCriteriaMethod();
}

public interface IChoices : ICriteria
{
    void SomeChoicesMethod();
}

и затем используйте его вот так

foreach (ICriteria criteria in criterias)
{
    // something
    var choice = criteria as IChoices;
    if (choice != null)
        // do something else
}
0 голосов
/ 24 декабря 2010

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

0 голосов
/ 24 декабря 2010

Здесь есть две опции:

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

Или: у вас могут быть такие методы, как (для копирования из TypeConverter) GetStandardValuesSupported - если это возвращает true, разумно вызвать метод GetStandardValues;если это возвращает false, вызывающий не должен вызывать GetStandardValues (и он, вероятно, выдаст NotSupportedException, но хорошо написанный вызывающий никогда не увидит их, потому что он наблюдает *Supported).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...