Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在OOP中分别调用父对象和子对象_Java_Php_Oop - Fatal编程技术网

Java 在OOP中分别调用父对象和子对象

Java 在OOP中分别调用父对象和子对象,java,php,oop,Java,Php,Oop,我以为我在OOP中还行,但似乎遇到了绊脚石 在这个例子中,我有一辆汽车,宝马和奥迪。这辆车有一系列的行为,宝马和奥迪分别继承了车外的行为 ---Car--- | ----- | ---------- BMW --- Audi ---汽车--- | ----- | ---------- 宝马-奥迪 当用户创建一个对象时,他们通过子类(例如new BMW)来创建。这很好,因为BMW有不同的属性以及检索和存储这些属性的方法。但是,在下一个屏幕上,我想显示汽车(可以是宝马或奥迪),因此本质上,这里我想做

我以为我在OOP中还行,但似乎遇到了绊脚石

在这个例子中,我有一辆汽车,宝马和奥迪。这辆车有一系列的行为,宝马和奥迪分别继承了车外的行为

---Car--- | ----- | ---------- BMW --- Audi ---汽车--- | ----- | ---------- 宝马-奥迪
当用户创建一个对象时,他们通过子类(例如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';
    }
}