【发布时间】:2009-11-02 14:42:45
【问题描述】:
我希望能够比较从 C# 中的同一个抽象类派生的两个类。下面的代码说明了我的问题。
我现在可以通过将BaseClass 设为非抽象来修复代码,然后在ToBassClass() 中返回一个new BaseClass 对象。但就没有更优雅、更高效的解决方案吗?
abstract class BaseClass
{
BaseClass(int x)
{
X = x;
}
int X { get; private set; }
// It is probably not necessary to override Equals for such a simple class,
// but I've done it to illustrate my point.
override Equals(object other)
{
if (!other is BaseClass)
{
return false;
}
BaseClass otherBaseClass = (BaseClass)other;
return (otherBaseClass.X == this.X);
}
BaseClass ToBaseClass()
{
// The explicit is only included for clarity.
return (BaseClass)this;
}
}
class ClassA : BaseClass
{
ClassA(int x, int y)
: base (x)
{
Y = y;
}
int Y { get; private set; }
}
class ClassB : BaseClass
{
ClassB(int x, int z)
: base (x)
{
Z = z;
}
int Z { get; private set; }
}
var a = new A(1, 2);
var b = new B(1, 3);
// This fails because despite the call to ToBaseClass(), a and b are treated
// as ClassA and ClassB classes so the overridden Equals() is never called.
Assert.AreEqual(a.ToBaseClass(), b.ToBaseClass());
【问题讨论】:
-
另外,int Z { get;私人Z; } 应该是 int Z { get;私人套装; } ?
标签: c# oop abstract-class