2015-06-11 3 views
1
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() для реализации клона. но как я могу сделать то же самое в быстром? Должен ли я написать что-то подобное, чтобы реализовать клон в swift?Как клонировать объект, как Java в быстрой

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

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

Кажется, что с одним классом, одним членом. но если у меня много дочернего класса, и у каждого дочернего класса есть разные члены, это будет много кода, я должен реализовать клон для каждого дочернего класса.

В java, только один метод clone в суперклассе, это намного проще.

+0

http://stackoverflow.com/questions/24754559/how-to-do-deep-copy-in-swift – aadarshsg

+0

спасибо, я видел это, это не тот ответ, который я хочу. @aadarshs –

+0

Я предполагаю, что ответ заключается в том, что Swift не хватает этого комфорта. Не знаю, приносит ли Swift2 какие-либо улучшения здесь. –

ответ

1

В Obj-C правильным способом копирования объектов является использование протокола NSCopying. В Swift вы обычно должны использовать конструктор копирования, хотя вы можете использовать NSCopying для классов, полученных из NSObject.

Да, вы должны написать больше кода, однако clone в Java - одна из худших проблем ООП на Java. Он не разработан хорошо. Тот факт, что он решает, что будет скопирован для вас, не очень хорошо.

Также см How to properly override clone method?

Короче говоря, в Java, если вы реализуете clone, вы не должны вызывать Object.clone. Реализуйте создание объекта с помощью конструктора и решите сами, что нужно копировать и как.

+0

Почему клоун в java - одна из худших проблем ООП? не могли бы вы объяснить подробно, пожалуйста? –

+0

@JIEWANG Одна из самых интересных проблем заключается в том, что он создает объект без вызова каких-либо конструкторов. Принудительная проверка для 'Cloneable' тоже не очень хорошая. В Интернете существует множество примеров проблем '.clone'. Реализация 'clone' с помощью частного конструктора копирования - хорошая идея. Конечно, тогда вы получите то же самое, что и в случае с NSCopying. – Sulthan

+0

https://www.agiledeveloper.com/articles/cloning072002.htm @Sulthan спасибо, я прочитал эту статью, и .clone кажется не слишком плохим, если в классе нет статического или конечного атрибута. –

Смежные вопросы