简体   繁体   English

Java可复制对象,类似于此Python示例

[英]Java copiable objects, similar to this Python example

So, here's what I can do in Python: 因此,这是我可以在Python中执行的操作:

class Copiable(object):

    def copy_from(self, other):
        """ This method must be implemented by subclasses to define their
            own copy-behaviour. Never forget to call the super-method. """

        pass

    def copy(self):
        """ Creates a new copy of the object the method is called with. """

        instance = self.__new__(self.__class__)
        instance.copy_from(self)
        return instance

class Rectangle(Copiable):

    def __init__(self, x, y, w, h):
        super(Rectangle, self).__init__()
        self.x = x
        self.y = y
        self.w = w
        self.h = h

  # Copiable

    def copy_from(self, other):
        self.x = other.x
        self.y = other.y
        self.w = other.w
        self.h = other.h
        super(Rectangle, self).copy_from(self)

There are two problems I'm facing in the Java version of it: 我在Java版本中面临两个问题:

  • I have no clue how to create an instance of a class similar to Python's __new__ method. 我不知道如何创建类似于Python的__new__方法的类的实例。
  • I want Copiable to be an interface, but then, I am unable to implement the clone() method. 我希望将Copiable接口,但是之后,我无法实现clone()方法。

Can you think of a solution? 您能想到解决方案吗? Thanks 谢谢

Java uses new keyword for constructing objects. Java使用new关键字构造对象。 Creating a Copiable interface should not interfere with clone() method. 创建可Copiable接口不应干扰clone()方法。

public interface Copiable<T> {
    public T copy();
    public T copyFrom(T other);
}

public class Rectangle implements Copiable<Rectangle> {

    private int x, y, w, h;

    @Override
    public Rectangle copy() {
        return new Rectangle();
    }

    @Override
    public Rectangle copyFrom(Rectangle other) {
        return new Rectangle(other);
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getW() {
        return w;
    }

    public int getH() {
        return h;
    }

    public Rectangle() {}
    public Rectangle(Rectangle other) {
        this.x = other.getX();
        this.y = other.getY();
        this.w = other.getW();
        this.h = other.getH();
    }
} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM