我有一个类,想以装饰器/适配器的方式扩展其功能,但我不希望扩展类知道它正在扩展哪种类型的类,也不想为每种要扩展的对象编写新类。然而,我想要扩展的所有对象都共享一个基类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属性就可以了。而且,由于它是泛型的,我不需要进行任何装箱操作即可获得功能。虽然有点丑陋,但它确实有效。
如果存在模式,这是什么模式,你们看到了哪些缺陷?有更好的方法来实现这个吗?