以为我在OOP上表现得很好,但似乎遇到了绊脚石。
在这个例子中,我有一辆汽车,一辆宝马和一辆奥迪。汽车有一套行为,宝马和奥迪分别继承了汽车。
---Car--- | ----- | ---------- BMW --- Audi
当用户创建对象时,他们通过子类(例如新BMW)执行此操作。这很好,因为宝马具有不同的属性以及检索和存储这些属性的方法。然而,在下一个屏幕上,我想要显示汽车(可能是宝马或奥迪),所以基本上我想做Car-> getName(),例如,请记住宝马的名字与奥迪的名字存储方式不同。我该如何实现这一目标?我可以使用案例陈述,但我真的不想这样做,因为我不认为这是好习惯。有什么想法吗?
答案 0 :(得分:1)
您需要使getName()
成为一种抽象方法。使Car
成为一个抽象类,以便它不能被实例化。然后在Audi
和BMW
子类中,覆盖getName()
方法以正确返回名称。
这都是假设Java,但我确信PHP有类似的OOP概念。
编辑:看来你可能需要一家工厂。首先,让汽车抽象。然后,在某处使用此方法(如Car中的静态方法)。public Car carFactory(DB database) {
if (DB.shouldMakeAudi()) {
return new Audi();
} else if (DB.shouldMakeBMW()) {
return new BMW();
} else {
return null;
}
}
答案 1 :(得分:0)
类CAR可以由一个方法组成,例如getName();它设置类属性$ _carName中的值;
class car {
protected $_carName;
protected function getCarName(){
return $this->_carName;
}
}
所以,现在你要做的是用子类中的setter函数设置$ _carName。无论何时您想获取carname,您都可以使用每个子classInstance来获取相应的carname。
答案 2 :(得分:0)
你可以拥有你的Car类,如下:
public abstract class Car {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
让您的宝马和奥迪继承您的汽车,并在此处包含任何宝马和奥迪的特定名称:
public class BMW extends Car {
private String bmwSpecificName;
}
public class Audi extends Car {
private String AudiSpecificName;
}
答案 3 :(得分:0)
你有抽象类Car,Audio和BMW。它们简化了解释。如果要提取对象的名称,只需调用getName即可。在这个例子中,BMW或Audio内部存储名称绝对无关紧要。你得到一个静态类型Car的对象(可以是BMW或Audio中的一个作为实际类型),只需拨打getName()
。
<?php
abstract class Car {
/**
* Returns the name of the car.
* @return string
*/
abstract function getName();
}
class BMW extends Car {
public function getName() {
return 'bmw';
}
}
class Audio extends Car {
public function getName() {
return 'audio';
}
}
答案 4 :(得分:-2)
正如你所说的那样,这是不好的做法,但如果你真的想按照你的描述去做,你就可以这样做(适用于Java):
//in Audi class
String methodToGetAudiName();
//in BMW class
String methodToGetBMWName();
if (carInstance instanceof Audi)
stringToStoreName = ((Audi)carInstance).methodToGetAudiName();
else if (carInstance instanceof BMW)
stringToStoreName = ((BMW)carInstance).methodToGetBMWName();