接口,抽象类和抽象类的方法

阿肯昆尼·艾伦

我正在学习如何使用Factory模式在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.

挑战在于,Car实例可以访问Car接口上定义的所有其他方法,但不能访问isTankFull()抽象类上定义但接口上没有定义的方法。我希望我的解释很清楚。

磷虾

之所以看不到该方法,是因为您的c对象被声明为Car接口。当然,当它从工厂方法中出来时,它是一个SmallCar,但是您的变量中只有接口。您可以将声明更改为AbstractCar c = CarFactory.createCar("SmallCar", regnum);

您可以在使用接口时完成此操作的另一种方法是,在尝试访问不在接口上的方法时c对象转换为一个对象AbstractCar,但是您需要小心,因为工厂总是有可能返回对象实现了Car,但是没有实现AbstractCar

if (c instanceof AbstractCar) {
    ((AbstarctCar)c).isTankFull();
}

当然,另一种简单的解决方案是将方法添加到界面中,尽管这将消除此问题的教学机会。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP接口和抽象类继承的最佳实践?

来自分类Dev

具有所有方法抽象和接口的抽象类之间的区别?

来自分类Dev

从抽象类继承方法

来自分类Dev

抽象类和接口

来自分类Dev

类设计-接口还是抽象类?

来自分类Dev

在抽象类和接口之间选择

来自分类Dev

接口与抽象类的方法为空

来自分类Dev

重载抽象类中的抽象方法

来自分类Dev

仅包含抽象方法和接口的抽象类-应该使用哪个?

来自分类Dev

Java-抽象类和接口

来自分类Dev

抽象类和toString()方法

来自分类Dev

类扩展抽象类实现接口

来自分类Dev

F#中的接口和抽象类

来自分类Dev

普通接口类和仅具有抽象方法的抽象类之间是否有区别?

来自分类Dev

扩展抽象类时接口和类的合并

来自分类Dev

动态调用-具有接口和抽象类的Java

来自分类Dev

抽象类,类,接口

来自分类Dev

抽象类中的抽象方法

来自分类Dev

如何在抽象类和接口之间进行选择

来自分类Dev

接口,抽象类和实现

来自分类Dev

没有抽象类的抽象方法

来自分类Dev

从抽象类测试子类的抽象方法

来自分类Dev

@ModelAttribute和抽象类

来自分类Dev

F#中的接口和抽象类

来自分类Dev

抽象类的抽象方法的部分实现

来自分类Dev

与抽象类的接口

来自分类Dev

从 UML 类图中派生抽象类和接口

来自分类Dev

使用接口和抽象类

来自分类Dev

非抽象类中的抽象方法