2015-12-02 55 views
1

我正在重构两个类,试图将它们合并为一个,其中之前一个是另一个的较重版本。问题在于较重的班级并未完全包围较轻的班级。我正在考虑创建一个包含所有必需属性的类,其中每个预先存在的类现在是同一类的一部分,但是使用不同的初始化器实例化。在对象上未使用的属性有什么伤害?

为了给你一个想法,让我们说,我想,以减少这些:

ClassA.h 

@interface 
@property int shared1; 
@property int shared2; 
@property int a1; 
@property int a2; 
@end 

ClassB.h 

@interface 
@property int shared1; 
@property int shared2; 
@property int b1; 
@property int b2; 
@end 

我的计划是把这些结合起来:

ClassC.h 
@interface 
@property int shared1; 
@property int shared2; 
@property int a1; 
@property int a2; 
@property int b1; 
@property int b2; 

- (id) initHeavyVersion; // this will set b1 and b2 as well as shared but not a1/a2 
- (id) initLightVersion; // this will set a1 and a2 as well as shared but not b1/b2 
@end 

是否有这样做的时候不造成任何伤害重叠的属性本身可能是相当大的对象?我看到它的方式,当这些属性未被使用时,它们应该只是携带一些额外的nil,只不过是。所以性能/内存问题应该是最小的。不利之处在于混乱的公共界面。

我拒绝作文,因为那仍然会导致两个班级,而我的目标是将这些班级压缩成一个(几乎任何成本)。同样,代表也会产生同样的问题。

我看到的唯一选择是使用关联的对象,但这看起来不必要地棘手/花哨,并且仍然依赖于单独的初始化函数。

任何批评或替代建议将是最受欢迎的。

回答

2

面向对象编程的常用方法是将共享部分设为抽象超类。这样,第一个(具体)子类只有A属性,第二个(具体)子类只有B属性,但共享材质的功能封装得很好。实施超类本身永远不应实例化的规则很容易实现。

如果你坚持只有一个类,你基本上正在做面向对象编程的。这没有错;这有点奇怪。如果你打算这样做,我会建议添加一些错误检查。例如,您可以有一个标志,指出这是A类型还是B类型,以便在有人试图从B类型访问A属性时引发异常。但是这对我来说似乎很难理解,因为你正在以一种低级的方式重新实现面向对象。类层次结构的全部目的是用类型学取代条件;你试图撤消这个好处,我不明白为什么。