2011-04-24 57 views
2

我有一个类:C#创建从一个继承类构造一类

class Cube 
{ 
    public string Name; 
    public string TexturePath; 
} 

而且继承Cube

class DrawableCube : Cube 
{ 
    public Texture2D Texture; 
    public Shader Shader; 
} 

假设我有Cube的集合,我想打开另一个类到DrawableCube。如果不创建一个以Cube作为参数并复制所有属性的构造函数,如何使用生成的类型DrawableCube复制Cube

+5

此代码是邪恶的,你声明了两个名称相同的公共成员除了资本是不同类型的... – alternative 2011-04-24 21:12:43

+2

我想你所谈论的是去除的样板。据我所知,不可能在不复制所有价值的情况下做到这一点;你为什么首先要做这件事? – alternative 2011-04-24 21:14:00

+0

@mathepic对不起,我输入它仓促。固定 – Hannesh 2011-04-24 21:18:48

回答

6

恕我直言,这里最好的解决方案并不是从Cube继承DrawableCube,而是让UI类DrawableCube保留对数据类Cube的内部引用。但是,Cube可能应该设计为immutable class。这样DrawableCube将需要一个构造采取Cube,但你不必复制所有它的属性,你可以存储给出参考:

class DrawableCube : 
{ 
    private myCube; 

    public DrawableCube(Cube c) 
    { 
     myCube=c; 
    } 
} 
+0

'DrawableCube'几乎可以肯定是'Cube',所以这打破了OOP多态性。 – alternative 2011-04-24 21:23:49

+1

我认为你是对的。我可能生活在这里没有继承。要在Portal 2中引用GLaDOS,“最好的解决方案通常是最简单的” – Hannesh 2011-04-24 21:33:00

+1

@mathepic:这里问的问题是,在这里,'Cube'和'DrawableCube'确实需要多态性。如果是这种情况,他们应该有一个共同的基类或接口'ICube'。这将导致*代理设计模式*(http://en.wikipedia.org/wiki/Proxy_pattern),其中DrawableCube是Cube的代理。 – 2011-04-24 21:36:58

0

既然你不想要一个构造函数,我想唯一的其他选择是工厂模式。

+0

一个构造函数是好的,但我不想手动复制值。 (如果有人决定向立方体添加新字段,该怎么办?) – Hannesh 2011-04-24 21:17:14

+1

您的整个设计似乎都是问题所在。 – 2011-04-24 21:18:20

+0

您认为我应该在没有继承的情况下执行此操作,然后创建一个只包含Cube的DrawableCube类? – Hannesh 2011-04-24 21:21:04

1

警告:以下解决方案是丑陋的,但它是干什么的你要。

品牌Cube在其构造函数中采用CubeInformation类型的单个参数,并且它是唯一的成员(它是私有的)。它只是设置CubeInformation。然后它为该结构中的东西提供属性。

CubeInformation是包含Cube的数据的结构。

DrawableCube拥有一个构造函数,该构造函数需要Cube并从Cube复制CubeInformation结构。

瓦拉。如果有人必须向Cube添加更多数据,他们将它添加到CubeInformation结构中并实现Cube中的属性。 DrawableCube不需要维护。

1

如果您想将Cube的集合转换为DrawableCube的集合,那么继承可能不是正确的工具。

给聚集一试:

class DrawableCube //: Cube 
{ 
    public Cube TheCube { get; private set; } 
    public DrawableCube (Cube c) { TheCube = c; } 
    public Texture2D Texture; 
    public Shader Shader; 
}