这是一种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的所有属性之后)
答案 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() { ... }
}