您面临的问题是指称为多态性的 OOP 的一部分
我将使用接口而不是抽象类,接口与抽象类之间的区别在于接口只有方法描述符,抽象类也可以有方法和实现。
public interface InterfaceOfPigKiller {
void catchPig();
void cleanPig();
void killPig();
}
在抽象类中,我们实现了三个可用方法中的两个,因为我们假设这些操作对于将从我们的类继承的每个未来类型都是通用的。
public abstract class AbstractPigKiller implements InterfaceOfPigKiller{
private Ping pig;
public void catchPig() {
//the logic of catching pigs.
}
public void cleanPig() {
// the logic of pig cleaning.
}
}
现在我们将创建两个新类:
AnimalKiller - 导致猪死亡的人。
AnimalSaver - 负责放生猪的人。
public class AnimalKiller extends AbstractPigKiller {
public void killPig() {
// The killing operation
}
}
public class AnimalSaver extends AbstractPigKiller {
public void killPing() {
// The operation that will make pig free
}
}
由于我们有我们的结构,让我们看看它是如何工作的。
首先是执行序列的方法:
public void doTheRequiredOperation(InterfaceOfPigKiller killer) {
killer.catchPig();
killer.cleanPig();
killer.killPig();
}
正如我们在参数中看到的,我们不使用 classAnimalKiller
或AnimalSever
. 取而代之的是我们的界面。由于这个操作,我们可以对任何实现使用接口的类进行操作。
示例 1:
public void test() {
AnimalKiller aKiller = new AnimalKiller();// We create new instance of class AnimalKiller and assign to variable aKiller with is type of `AnimalKilleraKiller `
AnimalSaver aSaver = new AnimalSaver(); //
doTheRequiredOperation(aKiller);
doTheRequiredOperation(aSaver);
}
示例 2:
public void test() {
InterfaceOfPigKiller aKiller = new AnimalKiller();// We create new instance of class AnimalKiller and assign to variable aKiller with is type of `InterfaceOfPigKiller `
InterfaceOfPigKiller aSaver = new AnimalSaver(); //
doTheRequiredOperation(aKiller);
doTheRequiredOperation(aSaver);
}
代码示例 1 和 2 在 method 范围内相同doTheRequiredOperation
。不同之处在于我们将一次类型分配给类型,而在第二次我们将类型分配给接口。
结论
我们不能创建抽象类或接口的新对象,但我们可以将对象分配给接口或类类型。