【发布时间】:2018-08-15 19:59:22
【问题描述】:
我有一个基类(TFoo)和后代类(TBar);我正在为两者覆盖 == 运算符。我希望后代类检查自己的字段并调用基类的 == 运算符,以便基类进行自己的检查。
在下面的代码中,您将看到在TBar == operator 中,我将类型转换为基类以检查基类是否相等,如下所示:(TFoo)a == (TFoo)b。
(这似乎有效!希望我在测试中没有遗漏一些问题。)
但是,我正在寻找一种更优雅的方式来执行此操作。比如(base)a == (base)b或者a base.== b或者base.==(a, b)或者a.base.Equals(b)或者什么的。
显然,上面的例子不起作用,可能看起来很荒谬;如前所述,(TFoo)a == (TFoo)b 确实可以正常工作。我正在寻找一种方法来做到这一点无需明确命名TFoo 类。
编辑:感谢所有精彩的回复!我修改了下面的原代码,直接比较.GetType();我删除了几个人指出的愚蠢和危险的.Name。
class TFoo
{
public int foo;
public static bool operator ==(TFoo a, TFoo b)
{
return a.GetType() == b.GetType()
&& a.foo == b.foo;
}
public static bool operator !=(TFoo a, TFoo b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return (obj is TFoo) && this == (TFoo)obj;
}
public override int GetHashCode()
{
return this.foo;
}
}
class TBar : TFoo
{
public int bar;
public static bool operator ==(TBar a, TBar b)
{
return (TFoo)a == (TFoo)b
&& a.bar == b.bar;
}
public static bool operator !=(TBar a, TBar b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return (obj is TBar) && this == (TBar)obj;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
【问题讨论】:
-
你也可以只写
a.GetType() == b.GetType()而不写.Name和(obj as TFoo) == this。 -
a == b as TFoo呢? -
我不明白您为什么要检查两种类型的反映名称是否相等。你为什么要做这种奇怪的、危险的、错误的事情?如果意图是说类型必须相同,那么为什么不直接比较类型?
-
另外,这很危险,因为它不是空安全的。我们预计
foo == null应该可以工作,但在您的实现中,它总是崩溃。
标签: c# oop operators overriding