C#泛型编程-组合这些类

C#泛型编程-组合这些类,c#,generics,C#,Generics,首先是一些示例代码(简化),因为如果您像我一样,您希望检查代码,而不是试图阅读我试图解释的内容: interface IA { void MyMethod1(); void MyMethod2(); void MyMethod3(); void MyMethod4(); void MyMethod5(); } interface IB { void MyMethod1(); void MyMethod2(); void MyMet

首先是一些示例代码(简化),因为如果您像我一样,您希望检查代码,而不是试图阅读我试图解释的内容:

interface IA
{
    void MyMethod1();
    void MyMethod2();
    void MyMethod3();
    void MyMethod4();
    void MyMethod5();
}

interface IB
{
    void MyMethod1();
    void MyMethod2();
    void MyMethod3();
    void MyMethod4();
    void MyMethod5();
    void MyMethod6();
}

abstract class XA: IA
{
    public XA(IA[] As) { m_As = As; }

    public virtual void MyMethod1()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod2()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod3()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod4()
    {
        m_As[0].MyMethod1();
    }

    public virtual void MyMethod5()
    {
        throw new NotImplementedException();
    }

    protected IA[] m_As;
}

abstract class XB: IB
{
    public XB(IB[] Bs) { m_Bs = Bs; }

    public virtual void MyMethod1()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod2()
    {
        m_Bs[0].MyMethod6();
    }

    public virtual void MyMethod3()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod4()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod5()
    {
        throw new NotImplementedException();
    }

    public virtual void MyMethod6()
    {
        throw new NotImplementedException();
    }

    protected IB[] m_Bs;
}

class XXA: XA
{
    XXA(IA[] As): base(As) { }

    public override void MyMethod1()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod2()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod3()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod4()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod5()
    {
        throw new NotImplementedException();
    }

    public void MyOtherMethod1() { }
    public void MyOtherMethod2() { }
}

class XXB: XB
{
    XXB(IB[] Bs) : base(Bs) { }

    public override void MyMethod1()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod2()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod3()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod4()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod5()
    {
        throw new NotImplementedException();
    }

    public override void MyMethod6()
    {
        throw new NotImplementedException();
    }

    public void MyOtherMethod3() { }
    public void MyOtherMethod4() { }
}
我们在这里看到很多重复的代码。我正试图找出一种减少此代码并删除重复代码的好方法。更多关于这一点,请参见下文

IB本质上是IA的超集,但IB不是从IA继承的,因为IB不应该在可以使用IA的地方使用

然后我们有XA和XB。XB本质上只是一个带有一些附加功能的XA。同样,不能从XA继承,因为XB不是XA

此外,我们看到XA有一些IA类型的成员国。它取决于这个成员国是这个接口的成员国,所以这个类不能被模板化(这个词对吗?)

因为XA依赖于成员国,所以有可能突破一些不依赖成员数据(即m_As)的功能,但老实说,如果不依赖,那么作为成员函数又有什么意义呢?嗯,我想如果有其他一些状态不是IA类型的,可能会工作,但感觉像是黑客攻击,因为一些代码被分解了,而其他代码则没有

熟悉C++,在该语言中,我只需将XA作为模板类,IIA是模板参数。但我不能在C#中这样做,对吗?有人知道解决这场混乱的好办法吗

谢谢

因为有人问我,我正在尝试做一个模式匹配器,所以我有两个接口:

interface IPattern
{
    void UpdateIfMatch(String Line, bool Trim = true);
    void Reset();
    bool IsMatch();
    bool IsFound();
}

interface IDeletePattern
{
    void UpdateIfMatch(String Line, bool Trim = true);
    void Reset();
    bool IsMatch();
    bool IsFound();
    bool ShouldDelete();
}
IDeletePattern很特别,因为它使用一个函数ShouldDelete()来告诉类的用户何时应该删除与特定模式匹配的特定行(我应该举个例子吗?)。如果我在需要IPattern的地方使用IDeletePattern,我将失去ShouldDelete()功能,这是关于这个接口的全部要点,因此这是不允许的

因此,我将这两个接口分开。但是实现这些接口的所有类都共享很多实现细节,所以我希望尽可能多地共享它们。但当我尝试这样做时,我遇到了上面的场景


我可以发布完整的代码,但这将非常混乱。

这是一个初步答案:

为什么您只使用名为X的抽象类,它具有抽象方法,并且每个XA、XB都覆盖抽象方法,同时实现接口,并保持XXA继承自XA,而XXB继承自XB

更新:在我看到实际的代码后,您可以使用接口隔离

像这样:

interface IPattern
{
    void UpdateIfMatch(String Line, bool Trim = true);
    void Reset();
    bool IsMatch();
    bool IsFound();
}

interface IDeletePattern : IPatten
{    
    bool ShouldDelete();
}

你试图模糊代码,使它真的不可读。你有没有可能想到一个简单的、真实的场景来匹配你的问题,并相应地命名类/接口?你的B类属于你的a类,不是吗?你没有重复的代码,你有两个同名接口的重复实现。不确定到底是什么问题,但a可能会有所帮助?XA,XXA、XB、XXB、IA、IB很难阅读。使用您的代码,但要限制方法体的深度。老实说,我真的不明白这个问题。乍一看,似乎存在“胖接口”问题。将核心接口成员限制为一个,然后从中相应地实现。然后创建对应于独立类的接口这是我想要避免的,因为这意味着我可以在任何可以使用IPattern的地方使用IDeletePattern。但我可能可以将IPattern和IDeletePattern的公共部分分离到另一个接口中(并且永远不要在代码中的任何地方直接使用该接口)。