首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用战略模式

通用战略模式
EN

Stack Overflow用户
提问于 2017-08-30 19:51:38
回答 1查看 807关注 0票数 2

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

代码语言:javascript
复制
//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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-30 20:11:34

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

代码语言:javascript
复制
CredentialDLL Do(Credential input)
{
    if (input is SNMP)
    {
        return new SNMPMapper().Map(input);
    }
    else
    {
        return new HTPPMapper().Map(input);
    }
}

第二个可能性是将一个Map方法添加到抽象类中,然后在每个派生类中实现它。然后,您可以进一步简化Do方法,并消除检查类型的需要(这似乎不符合拥有泛型类或基类的目的)。

代码语言:javascript
复制
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();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45968658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档