显式运算符重载+继承

Mar*_*ero 5 c# polymorphism casting operator-overloading

我一直在考虑一种方法来解决我遇到的问题,但我不确定它是否有效。

假设我们有一个名为 A 的基类和 3 个子类 B、C 和 D。

        A
        ^
-----------------
|       |       |
B       C       D
Run Code Online (Sandbox Code Playgroud)

我们还有 X、Y 和 Z 三个类。

在我的系统上,B、C、D 类型的对象作为 A 类型传递,通常我必须将 B、C、D 类型的对象转换为对象 X、Y 或 Z(这不是强制转换,我手动转换它们,因为它们是完全不同的)。

因此,要将对象类型 A 转换为类型 X、Y 或 ZI,需要首先检查子类型,然后根据子类型对 A 对象进行一些操作的结果来初始化 X、Y 或 Z 对象。

我考虑过重载从 A 到 X、Y 或 Z 的显式转换操作,只需执行与转换它们时相同的过程,但后来我想...是否可以使用多态性并重载来自 B 的转换, C和D以某种方式,当我添加AI的新子类型时,不需要更改A的强制转换代码?(只需将显式强制转换重载添加到新子类型)

我希望我已经正确解释了自己,如果有什么令人困惑的地方,我深表歉意。

注意:我将为 X、Y、Z 添加强制转换重载

O. *_*per 2

您可以让类型的强制转换运算符A调用实例的虚拟(或抽象?)实例方法A,并为 的每个子类覆盖该方法AXY并且Z应该从该解决方案的共同基类派生,因此强制转换运算符可以将该基类作为结果类型。

public abstract class A
{
    protected abstract W ConvertToW();

    public static explicit operator W(A a)
    {
        return a.ConvertToW();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,是,和W的基类。XYZ