Java 在OOP中分别调用父对象和子对象
我以为我在OOP中还行,但似乎遇到了绊脚石 在这个例子中,我有一辆汽车,宝马和奥迪。这辆车有一系列的行为,宝马和奥迪分别继承了车外的行为 ---Car--- | ----- | ---------- BMW --- Audi ---汽车--- | ----- | ---------- 宝马-奥迪Java 在OOP中分别调用父对象和子对象,java,php,oop,Java,Php,Oop,我以为我在OOP中还行,但似乎遇到了绊脚石 在这个例子中,我有一辆汽车,宝马和奥迪。这辆车有一系列的行为,宝马和奥迪分别继承了车外的行为 ---Car--- | ----- | ---------- BMW --- Audi ---汽车--- | ----- | ---------- 宝马-奥迪 当用户创建一个对象时,他们通过子类(例如new BMW)来创建。这很好,因为BMW有不同的属性以及检索和存储这些属性的方法。但是,在下一个屏幕上,我想显示汽车(可以是宝马或奥迪),因此本质上,这里我想做
当用户创建一个对象时,他们通过子类(例如new BMW)来创建。这很好,因为BMW有不同的属性以及检索和存储这些属性的方法。但是,在下一个屏幕上,我想显示汽车(可以是宝马或奥迪),因此本质上,这里我想做Car->getName(),例如,记住宝马的名称与奥迪的名称存储方式不同。我如何做到这一点?我可以使用案例陈述,但我真的不想这样做,因为我认为这不是一个好的做法。有什么想法吗?您需要将
getName()
作为一个抽象方法。使Car
成为一个抽象类,这样它就不能被实例化。然后在Audi
和BMW
子类中,重写getName()
方法以正确返回名称
这都是假设Java,但我相信PHP也有类似的OOP概念
编辑:看来你可能需要一个工厂。首先,将汽车抽象化。然后,在某个地方使用这个方法(比如汽车中的静态方法)
CAR类可以由一个方法组成,比如getName();设置类属性$\u carName中的值
class car {
protected $_carName;
protected function getCarName(){
return $this->_carName;
}
}
现在,您要做的是在子类中使用setter函数设置$\u carName。无论何时,只要您想要获取carname,您都可以使用每个child classInstance来获取各自的carname 你可以上你的汽车课,就像这样:
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;
}
正如您所说,这是一种不好的做法,但如果您真的想按照您所描述的那样做,您可以这样做(适用于Java):
你有抽象的汽车、音响和宝马。为了便于解释,它们被简化了。如果要提取对象的名称,只需调用getName。在本例中,BMW或Audio如何在内部存储名称完全无关紧要。您得到一个静态类型Car的对象(可以是BMW或Audio中的一个作为实际类型),只需调用
getName()
carInstance.getName()
?@Keyser不完全是原因,但奥迪存储在音频表中,宝马存储在宝马表中。听起来像是一个可怕的结构,但没有深入的细节,我已经这样做了<代码>返回$this->\u carName代码>这是我设想的方式,但在我展示汽车的页面上,我不知道当时它是宝马还是奥迪,所以我需要调用汽车类,这样它就不能是抽象的。我不明白你的意思。你为什么需要知道汽车的类型?如果它是一辆汽车,你可以调用汽车的方法。是的,但是getName方法与BMW和Audit方法不同,这就是重点。相同的方法将根据车辆类型返回不同的名称。这不是你想要的吗?是的!我是不是错过了什么重要的东西,但如果我给新车打电话,它怎么知道是宝马呢?我不知道那是宝马还是奥迪?但为什么他们有共同的祖先呢?你说得绝对正确。但我知道他希望这样做,而不只是重写抽象类Car中的方法getName(),或者只是将其存储在超类中的公共字段中。但是,如果他只是没有公共字段,我很抱歉提出这种非面向对象的方式:)对不起,但世界上绝对没有理由这样做。如果你能想出一个原因,那只是因为你的课堂设计很糟糕。如果您发现自己正在做类似的事情,请删除代码并重新开始。但是重写getName()
方法没有问题,这就是继承的目的^^^^对,我想我误解了这个问题(我经常遇到…)。还有@GJK,你完全正确!!!
public class BMW extends Car {
private String bmwSpecificName;
}
public class Audi extends Car {
private String AudiSpecificName;
}
//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();
<?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';
}
}