在OOP中单独调用父对象和子对象

时间:2013-06-01 19:46:00

标签: java php oop

以为我在OOP上表现得很好,但似乎遇到了绊脚石。

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

---Car---
| ----- |
----------
BMW --- Audi

当用户创建对象时,他们通过子类(例如新BMW)执行此操作。这很好,因为宝马具有不同的属性以及检索和存储这些属性的方法。然而,在下一个屏幕上,我想要显示汽车(可能是宝马或奥迪),所以基本上我想做Car-> getName(),例如,请记住宝马的名字与奥迪的名字存储方式不同。我该如何实现这一目标?我可以使用案例陈述,但我真的不想这样做,因为我不认为这是好习惯。有什么想法吗?

5 个答案:

答案 0 :(得分:1)

您需要使getName()成为一种抽象方法。使Car成为一个抽象类,以便它不能被实例化。然后在AudiBMW子类中,覆盖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();