C #: список подклассов <Something>? - PullRequest
2 голосов
/ 15 декабря 2009

У меня есть класс EqualCondition, который реализует мой собственный интерфейс ICondition, который имеет только один метод: SatisfiedBy(Something).

public class EqualCondition : ICondition {
    private Something m_Something;

    public HelloCondition(Something something) {
        m_Something = something;
    }

    // Magic!!!
    public bool SatisfiedBy(Something something) {
        return something == m_Something;
    }
}

Так что ICondition очень просто реализовать. Сейчас я пытаюсь создать CombinationCondition, который также реализует его. Идея состоит в том, что CombinationCondition будет содержать список ICondition с, который будет определять, будет ли SatisfiedBy успешным или нет.

Моей первой мыслью было заставить CombinationCondition реализовать IList<Something>, но я быстро понял, что только дублирую List<Something>. Так почему бы просто не создать подкласс?

Эта идея звучала хорошо, пока я не начал снова думать о том, как реализовать SatisfiedBy, если я просто подкласс List<Something>. Мне нужно сделать:

return innerList.All(x => x.SatisfiedBy(something))

Но как мне получить доступ к внутреннему списку?

Ответы [ 4 ]

5 голосов
/ 15 декабря 2009

Лично для показанного вами варианта использования я бы просто сделал этот инструмент IEnumerable<Condition>. Затем вы можете просто реализовать GetEnumerator, вызвав (внутренний, инкапсулированный) метод List<Condition>.

Потенциально, ICollection<Condition> может иметь больше смысла (так что вы можете добавлять условия во время выполнения), но только если вам нужна эта возможность. Реализация IList<T> в этой ситуации выглядит излишней, для тех случаев использования, которые я вижу в этом.

1 голос
/ 15 декабря 2009

Из того, что вы опубликовали, я бы CombinationCondition содержал (инкапсулировал) List<Something>. Не нужно, чтобы внешний мир знал, что это список, за исключением случаев, когда это абсолютно необходимо.

Редактировать 1:

public class CombinationCondition : ICondition {
private List<ICondition> list;

public CombinationCondition(List<ICondition> list) {
    this.list = list;
}

// if you need it
public void AddCondition( ICondition condition ){
    list.Add( condition );
}

// Still Magic!!!
public bool SatisfiedBy(Something something) {
    return list.Any( x => x.SatisfiedBy( something ) );
}

}

Редактировать 2:
Вы могли бы также рассмотреть переименование CombinationCondition в CompoundCondition ... имеет больше смысла, по крайней мере для меня:)

0 голосов
/ 15 декабря 2009

Одной из возможностей может быть свойство типа IList , которое может быть "Условия".

Вам не нужен доступ к внутреннему списку - вы можете получить доступ к своему классу "сам".

Однако, предпочитайте подклассы из ICollection .

0 голосов
/ 15 декабря 2009

Я не уверен, что на 100% понимаю, что вы пытаетесь сделать, но решит ли это вашу проблему?

public interface ICondition<T>
{
   bool SatisfiedBy(T something);
}

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

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