在没有数据重复的情况下强制转换/实例化/转换为子类/超类

本文关键字:转换 实例化 超类 子类 情况下 数据 | 更新日期: 2023-09-27 18:21:09

这是一种面向对象的问题,答案适用于C++、C#、ObjC中的任何一个。在应用程序中,我有以下类结构。

class ToSend {
    public int id;
    public int prop1;
}
class Received : ToSend {
    public int prop2;
    public int prop3;
}
class Viewer : Received {
    public static int viewerProp;
    public String viewerMethod() {... Using viewerProp...}
}

接收到的类的集合是从服务接收的。viewerMethod(Viewer)应用于在列表中显示集合的EACH项。在多次选择和prop1更改之后,应该发回一组修改(ToSend)。

问题1:如何将Received的所有实例强制转换或转换为Viewer以使用其viewerMethod?我能用立面图案吗?我不想复制数据,因为这会占用太多空间。

问题2:我如何将Received的选定实例转换为ToSend以限制可访问属性?(显式强制转换后,JSon编码器将在传出消息中包含Received的所有属性)

在没有数据重复的情况下强制转换/实例化/转换为子类/超类

首先问问自己,继承是否是正确的解决方案。一般的经验法则是用单词来表达这两个类别之间的关系。

如果你说ClassA就是ClassB,那么在大多数情况下你应该使用继承。例如,老虎是哺乳动物,而哺乳动物是动物。老虎继承了所有动物共有的所有特性,加上所有哺乳动物共有的特性,再加上一些自己物种特有的特性。

如果你说a类有B类,那么在大多数情况下你应该使用作文。例如,老虎有牙齿和爪子。但人们永远不会说Tooth是老虎,所以Tooth类永远不应该继承自tiger类。相反,它应该是Tiger类的成员变量。

如果查看器不是Received的特殊情况,则不应继承自Received。

您可能希望对查看器使用组合而不是继承。毕竟,您没有接收查看器,您想使用查看器查看您接收的数据

class Viewer
{
    public Viewer(Received received) 
    { 
        this.received = received;
    }
    private Received received;
    public string ViewerMethod() { ... }
}