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的公共部分分离到另一个接口中(并且永远不要在代码中的任何地方直接使用该接口)。