gpt4 book ai didi

c# - 通用策略模式

转载 作者:行者123 更新时间:2023-11-30 23:09:12 26 4
gpt4 key购买 nike

我正在尝试使用通用类型实现策略模式。我尝试创建对象并最终调用它,但我不知道它的签名应该是什么样子。我的问题出在 ObjectProcessor 类(Do 方法)中。

//my code
abstract class Credential {}
class SNMP : Credential { }
class HTTP : Credential { }

//dll
abstract class CredentialDLL { }
class SNMPDLL : CredentialDLL { }
class HTTPDLL : CredentialDLL { }

interface IMapper<T, Y>
{
T Map(Y input);
Y Map(T input);
}

class SNMPMapper : IMapper<SNMP, SNMPDLL>
{
public SNMPDLL Map(SNMP input) { throw new NotImplementedException(); }
public SNMP Map(SNMPDLL input) { throw new NotImplementedException(); }
}

class HTPPMapper : IMapper<HTTP, HTTPDLL>
{
public HTTPDLL Map(HTTP input) { throw new NotImplementedException(); }
public HTTP Map(HTTPDLL input) { throw new NotImplementedException(); }
}

class ObjectProcessor
{
CredentialDLL Do(Credential input)
{
IMapper <?,?> mapper; // ??

if (input is SNMP)
{
mapper = new SNMPMapper();
}
else
{
mapper = new HTPPMapper();
}

return mapper.Map(input);
}
}

最佳答案

简单的答案是,您不能在 if 语句之外声明映射器,因为这两种类型中的每一种都返回不同的映射器(一个是 IMapper<SNMP, SNMPDLL>,另一个是 IMapper<HTTP, HTTPDLL>)。有多种方法可以解决这个问题,但如果不知道您的其余代码,就很难说什么是最佳选择。我能想到的最简单的更改是编辑您的 Do像这样的方法:

CredentialDLL Do(Credential input)
{
if (input is SNMP)
{
return new SNMPMapper().Map(input);
}
else
{
return new HTPPMapper().Map(input);
}
}

第二种可能是添加 Map方法到你的抽象类,然后在每个派生类中实现它。然后你可以简化 Do方法并消除了检查类型的需要(这似乎违背了拥有泛型或基类的目的)。

abstract class Credential
{
public abstract CredentialDLL Map();
}
class SNMP : Credential
{
public override CredentialDLL Map()
{
return new SNMPMapper().Map(this);
}
}

class HTTP : Credential
{
public override CredentialDLL Map()
{
return new HTTPMapper().Map(this);
}
}

// Simplified do method, it is now a one liner
CredentialDLL Do(Credential input)
{
return input.Map();
}

关于c# - 通用策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45968658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com