c# - 显式运算符重载 + 继承

标签 c# casting polymorphism operator-overloading

我一直在想办法解决我遇到的问题,但我不确定它是否可行。

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

        A
        ^
-----------------
|       |       |
B       C       D

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

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

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

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

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

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

最佳答案

假设X、Y、Z派生自同一个类型T,在A中声明一个抽象转换方法

public abstract class A
{
    public abstract T Convert();
}

并在 B 中覆盖它以返回 X,在 C 中覆盖它以返回 Y,在 D 中覆盖它以返回 Z。这样,每个类型都负责返回其自己的转换类型,并且当 a添加了新类型。

关于c# - 显式运算符重载 + 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073741/

相关文章:

c# - 如何用C#判断一台电脑有没有硬盘raid?

c# - 装箱值只是指向存储在托管堆中的值副本的指针吗?

c# - 使用 LINQ 在列表中链对

c++ - 如何在基类指针 vector 的元素上应用重载的多态函数

c++ - vptr的解析

c# - 自托管时设置 NServiceBus 端点名称/输入队列

关于指针的C代码

php - 如何将字符串转换为 boolean 值 php

json - Jackson 多态反序列化和序列化

c++ - 无法使用 boost::serialization 和 shared_ptr 反序列化