我想能夠比較兩個派生自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());
Assert.True()? – SoftMemes 2009-11-02 14:48:53
另外,int Z {get;私人Z; }應該是int Z {get;私人設置; }? – GraemeF 2009-11-02 14:51:55