我可以想出几种方法来实现类似上面的东西。
1.使用接口
如果您可以修改原始源代码,这可能是最好的选择。易于实施,易于维护。
public interface IDoSomething
{
void DoSomething();
}
public class Dog : Animal, IDoSomething
{
public void Bark()
{
}
void IDoSomething.DoSomething(){
Bark();
}
}
public class Cat : Animal, IDoSomething
{
public void Meow()
{
}
void IDoSomething.DoSomething(){
Meow();
}
}
如果您无法访问原始源代码,适配器可能是唯一的选择。您可以使用它们来“同步”您的代码访问 Cat 和 Dog 类的方式。您仍然可以像使用原始对象一样使用适配器,但使用经过修改的接口可以更好地满足新代码的需求。创建一个工厂以根据父类型创建适当的适配器将相当简单。
public IDoSomething
{
void DoSomething()
{
}
}
public DoSomethingFactory
{
public static IDoSomething( Animal parent )
{
if ( typeof( parent ) is Dog )
return new DoSomethingDog( parent as Dog );
if ( typeof( parent ) is Cat )
return new DoSomethingCat( parent as Cat );
return null;
}
}
public DoSomethingDog : Dog, IDoSomething
{
Dog _parent;
public DoSomethingDog( Dog parent )
{
_parent = parent;
}
public void DoSomething()
{
_parent.Bark();
}
}
public DoSomethingCat : Cat, IDoSomething
{
Cat _parent;
public DoSomethingCat( Cat parent )
{
_parent = parent;
}
public void DoSomething()
{
_parent.Meow();
}
}
除了这两个明显的实现之外,您可能还需要考虑这些:
使用装饰器动态增强类的功能。(类似于上面的“包装器”方法,但更清晰地融入到类结构中。)
实现您的类可以动态处理的一系列Command对象:
cat.Do( new MakeNoiseCommand() ); // Handled as "meow"
dog.Do( new MakeNoiseCommand() ); // Handled as "bark"
允许类似于Mediator的东西根据 Animal 的类型等转发请求:
public class AnimalMediator
{
public void MakeNoise( Animal animal )
{
if ( typeof( animal ) is Dog ) (animal as Dog).Bark();
else if ( typeof( animal ) is Cat ) (animal as Cat).Meow();
}
}