0

以为我在 OOP 方面还可以,但似乎遇到了绊脚石。

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

- -车 - -
| ----- |
----------
宝马——奥迪

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

4

5 回答 5

1

您需要创建getName()一个抽象方法。创建一个抽象类,使其Car无法实例化。然后在AudiBMW子类中,重写getName()方法以正确返回名称。

这都是假设 Java,但我确信 PHP 有类似的 OOP 概念。

编辑:看来你可能需要一个工厂。首先,将 Car 抽象化。然后,在某处使用此方法(例如 Car 中的静态方法)。

public Car carFactory(DB database) {
    if (DB.shouldMakeAudi()) {
        return new Audi();
    } else if (DB.shouldMakeBMW()) {
        return new BMW();
    } else {
        return null;
    }
}
于 2013-06-01T19:55:54.710 回答
0

那么类 CAR 可以由一个方法组成,比如 getName(); 它在类属性 $_carName 中设置值;

class car {
 protected $_carName;

 protected function getCarName(){
    return $this->_carName;
 }
}

所以,现在你要做的是在子类中使用 setter 函数设置 $_carName。并且每当您想获取汽车名称时,您都可以使用每个子类实例来获取各自的汽车名称。

于 2013-06-01T19:59:52.913 回答
0

你可以有你的汽车类,像这样:

public abstract class Car {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

让您的 BMW 和 Audi 继承您的 Car,并在此处包含任何 BMW 和 Audi 特定名称:

public class BMW extends Car {

    private String bmwSpecificName;

}

public class Audi extends Car {

    private String AudiSpecificName;

}
于 2013-06-01T20:01:56.740 回答
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';
    }
}
于 2013-07-25T13:38:43.047 回答
-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();
于 2013-06-01T20:05:04.583 回答