如何正确继承克隆方法?
How to inherit cloning methods properly?
我有一个底座 class (A
) 和一个交付的底座 (B
)。他们继承了我制作的 ICloneable<>
通用接口:
interface ICloneable<T>
{
T Clone();
}
我想覆盖 B
中的 A.Clone()
方法,但是 B.Clone()
returns 类型的对象 B
而不是 A
,但是,重写不允许这样做。
我有一些解决方法,但我发现它真的很难看:
class A : ICloneable<A>
{
virtual A Clone() => /*magic*/;
}
class B : A, ICloneable<B>
{
B CloneAsB() => /*other kind of magic*/;
override A Clone() => CloneAsB();
}
(我还添加了非泛型 ICloneable
的显式实现,但没有在示例中显示。)
有没有更好的方法来实现这一点,而不必使用 false 克隆方法?
我找到了一个更好的解决方法:使用非泛型 ICloneable.Clone()
将泛型 ICloneable<A>.Clone()
方法的调用传递到继承层次结构中可能会有用,如下所示:
class A : ICloneable<A>, ICloneable
{
A Clone() => (A) ((ICloneable) this).Clone(); //This will call ICloneable.Clone in class B if the type of the object is B!
//If object is of type B, not this but the derived method is called:
object ICloneable.Clone() => /*Cloning, if object is an instance of A*/;
}
class B : A, ICloneable<B>
{
new B Clone() => (B) ((ICloneable) this).Clone(); //This will call ICloneable.Clone in a derived type if object is of more derived type!
//If object is of even more derived type, not this but the method of the derived class is called:
object ICloneable.Clone() => /*Cloning, if object is an instance of B*/;
}
//Same implementation for class C...
这样做的好处是 none 的方法必须显式检查对象的类型(即在 class A
中 Clone()
没有检查对象是否为 B
).
类型
我有一个底座 class (A
) 和一个交付的底座 (B
)。他们继承了我制作的 ICloneable<>
通用接口:
interface ICloneable<T>
{
T Clone();
}
我想覆盖 B
中的 A.Clone()
方法,但是 B.Clone()
returns 类型的对象 B
而不是 A
,但是,重写不允许这样做。
我有一些解决方法,但我发现它真的很难看:
class A : ICloneable<A>
{
virtual A Clone() => /*magic*/;
}
class B : A, ICloneable<B>
{
B CloneAsB() => /*other kind of magic*/;
override A Clone() => CloneAsB();
}
(我还添加了非泛型 ICloneable
的显式实现,但没有在示例中显示。)
有没有更好的方法来实现这一点,而不必使用 false 克隆方法?
我找到了一个更好的解决方法:使用非泛型 ICloneable.Clone()
将泛型 ICloneable<A>.Clone()
方法的调用传递到继承层次结构中可能会有用,如下所示:
class A : ICloneable<A>, ICloneable
{
A Clone() => (A) ((ICloneable) this).Clone(); //This will call ICloneable.Clone in class B if the type of the object is B!
//If object is of type B, not this but the derived method is called:
object ICloneable.Clone() => /*Cloning, if object is an instance of A*/;
}
class B : A, ICloneable<B>
{
new B Clone() => (B) ((ICloneable) this).Clone(); //This will call ICloneable.Clone in a derived type if object is of more derived type!
//If object is of even more derived type, not this but the method of the derived class is called:
object ICloneable.Clone() => /*Cloning, if object is an instance of B*/;
}
//Same implementation for class C...
这样做的好处是 none 的方法必须显式检查对象的类型(即在 class A
中 Clone()
没有检查对象是否为 B
).