C#如何在泛型父类中调用重载运算符?
以下问题: 在泛型父类ParentA的函数定义中,我想从ChildB调用重载运算符: 请参见以下结构C#如何在泛型父类中调用重载运算符?,c#,.net,inheritance,C#,.net,Inheritance,以下问题: 在泛型父类ParentA的函数定义中,我想从ChildB调用重载运算符: 请参见以下结构 class ParentA<T> where T : ParentB { public bool Contains(T element) { T element2; return element==element2; } } class ChildB : ParentB { public static b
class ParentA<T> where T : ParentB
{
public bool Contains(T element)
{
T element2;
return element==element2;
}
}
class ChildB : ParentB
{
public static bool operator ==(ChildB s1, ChildB s2)
{
//this one should be used
}
}
ChildA :ParentA<ChildB>
{
//make use of inherited function Contains(ChildB element)
}
借
现在看来,它真的做到了。我只是不明白为什么…您能显示试图使用重载运算符的代码吗?还有ParentB类的代码?您是否试图以某种方式从基类调用
==
?我认为这不可能直接做到,但是您可以重写基类中的Equals
,并从=
操作符调用它,然后base.Equals
应该可以工作。操作符方法是静态类型的,这就是为什么它们在编译时而不是运行时解析。因此,您需要在ParentB
@user1672994中提供运算符的定义我应该如何在ParentB中定义一个作用于childB的运算符?只有在编译时知道您比较的两个对象都是ParentB类型时,才会调用您的==运算符。否则,操作员的签名将不匹配。如果你想让第二个参数是任何东西(比如在Equals中),你也必须给它类型object。你能展示一下试图使用重载操作符的代码吗?还有ParentB类的代码?您是否试图以某种方式从基类调用==
?我认为这不可能直接做到,但是您可以重写基类中的Equals
,并从=
操作符调用它,然后base.Equals
应该可以工作。操作符方法是静态类型的,这就是为什么它们在编译时而不是运行时解析。因此,您需要在ParentB
@user1672994中提供运算符的定义我应该如何在ParentB中定义一个作用于childB的运算符?只有在编译时知道您比较的两个对象都是ParentB类型时,才会调用您的==运算符。否则,操作员的签名将不匹配。如果您想让第二个参数只是任何东西(比如Equals),那么您也必须给它类型object。
public abstract class ElementBase
{
protected Element element;
public Element Element
{
get { return element; }
set { element = value; }
}
public static bool operator ==(ElementBase e1, ElementBase e2)
{
return e1.element == e2.element;
}
public static bool operator !=(ElementBase e1, ElementBase e2)
{
return e1.element != e2.element;
}
public override bool Equals(object obj)
{
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
return false;
else
{
ElementBase element = (ElementBase)obj;
return this == element;
}
}
}
public class Structure : ElementBase
{
public bool flag;
public static bool operator ==(Structure s1, Structure s2)
{
return s1.element == s2.element && s1.flag==s2.flag;
}
public static bool operator !=(Structure s1, Structure s2)
{
return s1.element != s2.element || s1.flag!=s2.flag;
}
public override bool Equals(object obj)
{
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
return false;
else
{
Structure structure = (Structure)obj;
return this == structure;
}
}
}
public class MapBase<T> where T : ElementBase
{
protected Dictionary<long, T> elements = new Dictionary<long, T>();
public bool Contains(T element)
{
...
return element==elements[id];
}
}
public class StructureMap : MapBase<Structure>
{
void someFunction()
{
//make use of Contains(Structure element)
}
}
return element==element2;
return element.Equals(element2);