相同的类,不同的命名空间,一种简化的方法
本文关键字:一种 方法 命名空间 | 更新日期: 2023-09-27 17:47:21
我正在使用一个网络服务,该服务在两个命名空间中提供几乎重复的代码。 例如,假设 PigFeet 和 HorseFeet,这两个命名空间都包含一个 Feet 类,而与 Feet 类一起使用的其他代码要求它是同一命名空间的一部分。
现在在我的代码中,我被迫做这样的事情:
if( _animalType == AnimalType.Pig )
{
//namespace is pigfeet
PigFeet.Feet feet = new Feet();
feet.WashFeet();
}
if( _animalType == AnimalType.Horse )
{
//namespace is horsefeet
HorseFeet.Feet feet = new Feet();
feet.WashFeet();
}
这给我留下了很多重复的代码。 有没有办法更动态地选择命名空间?
在命名空间导入中,可以将别名分配给特定的命名空间或成员。
using PigFeet = PigFeet.Feet;
using HorseFeet = HorseFeet.Feet;
//now your sample code should look something like
if( _animalType == AnimalType.Pig )
{
//namespace is pigfeet
PigFeet feet = new PigFeet();
feet.WashFeet();
}
if( _animalType == AnimalType.Horse )
{
//namespace is horsefeet
HorseFeet feet = new HorseFeet();
feet.WashFeet();
}
命名空间不是问题 - 只是 2 个类不相关,因此没有可用于多态性的继承链。
您需要查看诸如鸭子类型,适配器模式或构建自己的代理类之类的东西,以使自己进入通用接口。对于少量的实现,我只需构建一个适配器类,该类委托给它拥有的任何非空实例:
interface IFeet {
void WashFeet();
}
class FeetAdapter : IFeet {
private PigFeet.Feet _pigFeet;
private HorseFeet.Feet _horseFeet;
private FeetAdapter(PigFeet.Feet pigFeet) {
_pigFeet = pigFeet;
}
private FeetAdapter(HorseFeet.Feet horseFeet) {
_horseFeet = horseFeet;
}
public void WashFeet() {
if (_pigFeet != null) {
_pigFeet.WashFeet();
} else {
_horseFeet.WashFeet();
}
}
public static FeetAdapter Create(AnimalType animalType) {
switch (animalType) {
case AnimalType.Pig:
return new FeetAdapter(new PigFeet.Feet());
case AnimalType.Horse:
return new FeetAdapter(new HorseFeet.Feet());
}
}
}
对于较大的情况,最好使用单独的PigFeetAdapter和HorseFeetAdapter,它们都实现了IFeet,以及一个FeetAdapterFactory来创建它们 - 但概念与我上面显示的相同。
只是组织类型的一种方式。在您的情况下,您有 2 个或更多不同的类,这些类具有具有相同签名但没有通用接口的方法。如果无法更改类的代码,则避免此处重复的唯一方法是在失去编译时类型安全性时使用反射。
让事情变得更好之前让事情变得更糟。
您可以将所有 AnimalType 决策逻辑封装在单个类中。
在两种类型(猪脚和马蹄)之间,有一些类似的方法......由于 WashFeet 具有通用签名(没有参数的 void),因此可以使用 System.Action 来引用该方法。 其他具有通用签名(和参数)的方法可能需要 System.Func(T)。 没有公共签名的其他方法可能需要强制转换为公共签名。
下面是客户端代码:
AnimalFeetFacade myFacade = new AnimalFeetFacade(_animalType);
myFacade.WashFeet();
下面是封装类。
public class AnimalFeetFacade
{
public AnimalFeetFacade(AnimalType theType)
{
if (theType == AnimalType.Pig)
{
_washFeet = WashPigFeet;
//TODO reference more PigFeet methods here
}
else if (theType == AnimalType.Horse)
{
_washFeet = WashHorseFeet;
//TODO reference more HorseFeet methods here
}
else
{
throw new NotImplementedException("AnimalFeetFacade only works with PigFeet and HorseFeet");
}
}
protected Action _washFeet;
public void WashFeet()
{
_washFeet.Invoke();
}
protected void WashPigFeet()
{
PigFeet.Feet = new PigFeet.Feet()
feet.WashFeet()
}
protected void WashHorseFeet()
{
HorseFeet.Feet = new HorseFeet.Feet()
feet.WashFeet()
}
}