在没有数据重复的情况下强制转换/实例化/转换为子类/超类
本文关键字:转换 实例化 超类 子类 情况下 数据 | 更新日期: 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() { ... }
}