Проблемы вы столкнулись относитесь к части ООП называется polymorphism
Вместо абстрактного класса я буду использовать интерфейс, разница между интерфейсом абстрактным классом является то, что интерфейс есть только описание методов, абстрактная класс может также имеют метод реализации.
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();
}
Как мы видим, в параметре мы не используем класс AnimalKiller
или 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 одинаково в рамках метода doTheRequiredOperation
. Разница в том, что мы присваиваем тип type type, а во втором мы присваиваем тип интерфейсу.
Заключение
Мы не можем создать новый объект абстрактного класса или интерфейса, но мы можем назначить объект для интерфейса или типа класса.
почему отрицательный голос :( –
Я думаю, что это вегетарианское – devdigital
Вы только собираетесь убить свиней или других животных, а также приветствовать? – Bart