Я изучаю как использовать Заводской шаблон для создания объектов в Java. Я хочу создать классы для управления автомобилями. Автомобиль может быть маленьким или большим. Я создал интерфейс, который определяет методы, реализуемые классом реализации. Абстрактный класс реализует некоторые из общих методов интерфейса, разделяемых малыми и большими автомобилями. Конкретные классы SmallCar и LargeCar реализуют оставшиеся методы абстрактного класса.Интерфейс, абстрактный класс и методы абстрактного класса
АВТОМОБИЛЬ ИНТЕРФЕЙС
public interface Car {
String getRegistrationNumber();
void drive();
}
абстрактный класс АВТОМОБИЛЬ Реализует АВТОМОБИЛЬ ИНТЕРФЕЙС
public abstract class AbstractCar implements Car {
private final RegistrationNumber regNumber;
private boolean tankFull = true;
public AbstractCar(RegistrationNumber regNumber) {
this.regNumber = regNumber;
}
@Override
public final String getregistrationNumber() {
return regNumber.toString();
}
/**This method is not defined in the implemented Car interface. I added it to
*the abstract class because I want subclasses of these abstract class
*to have this method*/
public boolean isTankFull() {
return tankFull;
}
}
маленького автомобиль ПРОДЛЕВАЕТ абстрактный класс
public final class SmallCar extends AbstractCar {
public SmallCar(RegistrationNumber regNum) {
super(regNum);
}
@Override
public void drive() {
//implemented here
}
}
ФАБРИКА КЛАСС:
Этот класс отвечает за создание экземпляров определенного типа автомобиля.
public final class CarFactory {
public static Car createCar(String carType, RegistrationNumber regNum) {
Car car = null;
if (carType.equals("Small") {
car = new SmallCar(regNum);
}
return car;
}
ОСНОВНОГО МЕТОД
RegistrationNumber regNum = new RegistrationNumber('a', 1234);
Car c = CarFactory.createCar("Small", regNum);
c.getRegistrationNumber(); //this works
c.isTankFull(); //this instance of Car cannot access the isTankFull method defined on the abstract class. The method is not defined on the Car interface though. I do not understand why.
Задача состоит в том, что экземпляр автомобиля может получить доступ к любому другому методу, определенному в интерфейсе автомобиля, но он не может получить доступ к методу isTankFull()
, определенному на абстрактном классе, но не определен на интерфейсе. Надеюсь, мои объяснения достаточно ясны.
Ничего странного здесь. Поместите isTankFull на интерфейс. – granadaCoder
Вам нужно отдать свой экземпляр в AbstractCar – CKing