转换/实例化/转换为子类/超类而不进行数据复制

时间:2012-01-20 18:20:38

标签: c# c++ objective-c oop

这是一种OOP问题,答案是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的所有属性之后)

2 个答案:

答案 0 :(得分:3)

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

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

如果你说ClassA有ClassB,那么在大多数情况下你应该使用成分。例如,Tiger HAS Teeth and Claws。但人们永远不会说牙齿是老虎,所以牙齿类不应该继承虎类。相反,它应该是Tiger类的成员变量。

如果Viewer不是Received的特例,则不应继承Received。

答案 1 :(得分:1)

您可能希望将合成用于查看器而不是继承。毕竟,您没有接收查看者,您希望使用查看器来查看您收到的数据

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

    private Received received;

    public string ViewerMethod() { ... }
}