【问题标题】:How to clone an object like Java in swift如何在swift中克隆像Java这样的对象
【发布时间】:2015-08-26 20:09:24
【问题描述】:
class Person implements Cloneable {
    int age;
    Person(int age) {
        this.age = age;
    }

    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

public static void main(String[] args) {
    Person p = new Person(0);
    Person p1 = (Person) p.clone();
    p.age = 10;
    System.out.println(p.age + " " + p1.age);

}

结果是 10 0 在 java 中,我们可以简单地使用 super.clone() 来实现克隆。 但是我怎样才能快速做同样的事情呢? 我必须写这样的东西来快速实现克隆吗?

class Person: NSObject, NSCopying {
     var age: Int?

    func copyWithZone(zone: NSZone) -> AnyObject {
        var p = Person()
        p.age = self.age
        return p
    }
}

一个班级,一个成员似乎没问题。但是如果我有很多子类,并且每个子类都有不同的成员,那将是很多代码,我应该为每个子类实现克隆。

在java中,超类中只有一个clone方法,要简单得多。

【问题讨论】:

  • 谢谢,我已经看到了,这不是我想要的答案。 @aadarshs
  • 我想答案是 Swift 缺乏这种舒适感。不知道 Swift2 是否带来了任何改进。

标签: swift


【解决方案1】:

在 Obj-C 中,复制对象的正确方法是使用 NSCopying 协议。 在 Swift 中,您通常应该使用复制构造函数,尽管您可以将 NSCopying 用于派生自 NSObject 的类。

是的,您必须编写更多代码,然而,Java 中的clone 是 Java 中最严重的 OOP 问题之一。它设计得不好。它决定要为您复制的内容这一事实并不是一件好事。

另见How to properly override clone method?

简而言之,在 Java 中,如果您正在实现 clone,则不应调用 Object.clone。使用构造函数实现对象创建,并自行决定应该复制什么以及如何复制。

【讨论】:

  • 为什么 java 中的克隆是最糟糕的 OOP 问题之一?你能详细解释一下吗?
  • @JIEWANG 最有趣的问题之一是它创建一个对象而不调用任何构造函数。 Cloneable 的强制检查也不好。网上有很多.clone问题的例子。使用私有复制构造函数实现clone 是个好主意。当然,那你得到的和NSCopying提供的完全一样。
  • agiledeveloper.com/articles/cloning072002.htm@Sulthan 谢谢,我已经阅读了这篇文章,如果类中没有 static 或 final 属性,.clone 似乎还不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多