У меня есть класс, который я хочу расширить функциональностью в виде декоратора / адаптера, только я не хочу, чтобы мой расширяющий класс знал что-либо о видах классов, которые он расширяет, и Я не хочу писать новый класс для каждого типа объекта, который я хочу расширить. Все объекты, которые я хотел бы расширить, имеют общий базовый класс Team
. Это звучит созрели для использования дженериков, поэтому вот моя первоначальная идея:
public class TournamentTeam<T> : T
where T : Team
{
private int mSeed;
public TournamentTeam(T team, int seed)
: base(team)
{
/*
* error checking stuff here
*/
// set class variables
this.mSeed = seed;
}
public int Seed
{
get { return this.mSeed; }
}
}
Это сделало бы то, что я хотел, так как теперь, если я хочу получить доступ к членам T, у нового класса есть все из них. Базовый конструктор позаботится о настройке состояния таким образом, чтобы расширенному классу не нужно было об этом беспокоиться. Я также не должен был бы знать, какие методы переопределить, чтобы указывать на внутренний объект типом декоратор / фасад. Излишне говорить, что это не скомпилировано. Итак, я попробовал что-то немного другое.
public class TournamentTeam<T> : Team
where T : Team
{
#region class variables
private int mSeed;
private T mTeam;
#endregion
public TournamentTeam(int seed, T team)
: base(team)
{
/*
* error checking stuff here
*/
// set class variables
this.mSeed = seed;
this.mTeam = team;
}
public int Seed
{
get { return this.mSeed; }
}
public T Team
{
get { return this.mTeam; }
}
}
Хорошо, теперь, если я хочу получить функциональность «базового класса», я просто вызываю свойство Team, и я готов идти дальше. И, поскольку это универсально, мне не нужно заниматься боксом, чтобы добраться до функциональности. это работает, это не красиво, но это работает.
Что это за образец, если он существует, и какие подводные камни вы все-таки увидите в этой идее? Есть ли лучший способ сделать это?