![]() |
1
2
如果克隆工作需要基类中的代码,则第一个选项是正确的。第二个选项允许您实现克隆方法而不调用基类中的代码。 如果不需要基类中的代码,则第二个选项是正确的。第一个选项不允许在不调用基类中的代码的情况下实现克隆方法。 |
![]() |
2
7
看起来像 Template method 图案:
|
![]() |
3
1
一般来说,我会使用第一种方法,因为它比较简单。但是,在某些情况下需要第二个。 请注意,以对象克隆为例可能不是最佳的。克隆是特殊的,因为返回的对象必须与要克隆的对象具有相同的类型,即使重写的方法是基类型。 所以假设你有一个从A继承的B类,你这样做:
使用第一种方法,克隆的对象必须由A创建,但类型必须是B类型。通常您将使用
|
![]() |
4
1
第一种选择是足够公平的,当您知道某个特定的作业在不同的派生类中会有所不同。也许你想要
如果您只是想克隆任何旧的T,但是想在子类中做一些小的调整,那么第二种方法就更合适了。但在本例中,请重写clone方法,而不是使用新名称创建新方法。例如
不,这对于一个克隆来说并不是完全有意义的,当你看它的时候,因为你要从基本克隆中得到一个T,把它转换成A并不是那么容易。 还有一些其他的选择你可以考虑。 一个是帮助类。您可能希望将公共代码移到静态类的静态方法中,以避免重复,而不是将任何代码移到T中。 另一个是拥有一个ICloner接口,它不理解合同,但是A和B理解实现,例如
足够困惑了吗? |