Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过扩展实现Java克隆_Java_Clone_Cloning - Fatal编程技术网

通过扩展实现Java克隆

通过扩展实现Java克隆,java,clone,cloning,Java,Clone,Cloning,想象一下情况: 我有两节课 public class Fruit{ } 以及: 我的程序有一个水果和一个水果销售对象。我想在果品销售的基础上创建全新的(克隆)果品2[水果](例如,有人购买了果品销售,它需要出现在他的包中,但作为一种普通水果,因为它不再在商店中)。在此过程中,方法getPrice和字段price被删除。 然后倒转过来——有人开了一家商店(…),把他的水果卖了。现在,我需要将水果转换为水果销售(我希望它作为“特价”放在商店里,作为“普通”放在我的包里,但作为独立的物品) 这些类将

想象一下情况:

我有两节课

public class Fruit{
}
以及:

我的程序有一个水果和一个水果销售对象。我想在果品销售的基础上创建全新的(克隆)果品2[水果](例如,有人购买了果品销售,它需要出现在他的包中,但作为一种普通水果,因为它不再在商店中)。在此过程中,方法getPrice和字段price被删除。 然后倒转过来——有人开了一家商店(…),把他的水果卖了。现在,我需要将水果转换为水果销售(我希望它作为“特价”放在商店里,作为“普通”放在我的包里,但作为独立的物品)

这些类将被重建、修改,并且可能需要对它们进行大量的工作,所以我不想仅仅通过复制每个字段来手动重写它们,因为这是毫无意义的。可以通过克隆吗?或者你有更好的想法吗?

使用作文:

public class Fruit {
   // your regular fruit class
}
您的“出售水果”:

现在,您可以通过传入一个
Fruit
实例来构造
FruitOnSale
实例,也可以从
FruitOnSale
实例中获得一个
Fruit
实例。请注意,当您使用
Fruit
实例初始化
FruitOnSale
实例时,它会创建
Fruit
实例的“副本”。这样做很好,否则您可以修改原始的
Fruit
实例,这将影响
FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,
getFruit()
不返回对内部实例的引用,而是创建一个全新的
Fruit
实例

虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用
水果
做一些事情,但对
水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这是违反LSP的一个例子。

使用合成:

public class Fruit {
   // your regular fruit class
}
您的“出售水果”:

现在,您可以通过传入一个
Fruit
实例来构造
FruitOnSale
实例,也可以从
FruitOnSale
实例中获得一个
Fruit
实例。请注意,当您使用
Fruit
实例初始化
FruitOnSale
实例时,它会创建
Fruit
实例的“副本”。这样做很好,否则您可以修改原始的
Fruit
实例,这将影响
FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,
getFruit()
不返回对内部实例的引用,而是创建一个全新的
Fruit
实例

虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用
水果
做一些事情,但对
水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这是违反LSP的一个例子。

使用合成:

public class Fruit {
   // your regular fruit class
}
您的“出售水果”:

现在,您可以通过传入一个
Fruit
实例来构造
FruitOnSale
实例,也可以从
FruitOnSale
实例中获得一个
Fruit
实例。请注意,当您使用
Fruit
实例初始化
FruitOnSale
实例时,它会创建
Fruit
实例的“副本”。这样做很好,否则您可以修改原始的
Fruit
实例,这将影响
FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,
getFruit()
不返回对内部实例的引用,而是创建一个全新的
Fruit
实例

虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用
水果
做一些事情,但对
水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这是违反LSP的一个例子。

使用合成:

public class Fruit {
   // your regular fruit class
}
您的“出售水果”:

现在,您可以通过传入一个
Fruit
实例来构造
FruitOnSale
实例,也可以从
FruitOnSale
实例中获得一个
Fruit
实例。请注意,当您使用
Fruit
实例初始化
FruitOnSale
实例时,它会创建
Fruit
实例的“副本”。这样做很好,否则您可以修改原始的
Fruit
实例,这将影响
FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,
getFruit()
不返回对内部实例的引用,而是创建一个全新的
Fruit
实例


虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用
水果
做一些事情,但对
水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这将是违反LSP的一个例子。

克隆和继承是两个非常不同且非常不相关的概念,如果我理解正确的话,这两个概念不太可能对您目前的情况有所帮助

克隆通常指何时要复制
public class WoodenChair extends WoodenFurniture{
    public void sit(){
        // Implementation here
    }
}
public class Fruit{
    private boolean onSale = false;
    private int price = 0;

   /**
    * Retrieves the price of the fruit if it is on sale.
    */
    public int getPrice(){
        // Check if the fruit is in the onSale state
        if(!onSale){
            // Rather than throwing exception, you can alternatively return an invalid price e.g. -1 to denote "not for sale"
            throw new IllegalStateException("not on sale");
        }

        return price;
    }

    public void putOnSale(int price){
        this.price = price;
        onSale = true;
    }

    public void takeOffSale(){
        onSale = false;
    }
}