【问题标题】:calling both the parent and child objects separately in OOP在 OOP 中分别调用父对象和子对象
【发布时间】:2013-06-01 19:46:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • carInstance.getName()?
  • @Keyser 不完全是原因,但奥迪存储在音频表中,而宝马存储在宝马表中。听起来像一个糟糕的结构,但没有详细说明我已经这样做了!

标签: java php oop


【解决方案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;
    }
}

【讨论】:

  • 这是我设想的方式,但在我展示汽车的页面上,我不知道当时它是宝马还是奥迪,所以我需要调用 Car 类所以它不能抽象。
  • 我不明白你的意思。为什么你需要知道汽车的类型?如果是 Car,则可以调用 Car 的方法。
  • true 但 getName 方法与宝马和奥迪不同
  • 这就是重点。根据 Car 的类型,相同的方法将返回不同的名称。这不是你想要的吗?
  • 是的!我是否在这里遗漏了一些重要的东西,但是如果我调用 new Car() 它怎么知道它是宝马?到时候我就分不清是宝马还是奥迪了?
【解决方案2】:

你可以有你的 Car 类,像这样:

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;

}

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • return $this -> _carName;
    【解决方案4】:

    您有抽象类 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';
        }
    }
    

    【讨论】:

      【解决方案5】:

      正如你所说,这是不好的做法,但如果你真的想按照你描述的那样做,你可以这样做(适用于 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();
      

      【讨论】:

      • 但是为什么在地球上,虽然他们有一个共同的祖先?
      • 你是绝对正确的。但我知道他想要这样做,而不仅仅是覆盖抽象类 Car 中的方法 getName() 或者只是将其存储在超类的公共字段中。但如果他只提到没有共同领域,我很抱歉提出这种非 OOP 方式:)
      • 对不起,世界上绝对没有理由这样做。如果你能想到一个原因,那只是因为你的班级设计很糟糕。如果您发现自己在做这样的事情,请删除您的代码并重新开始。
      • 但是重写getName()方法没有问题,这就是继承的意义^^
      • 对,我猜我误解了这个问题(我经常发生......)。还有@GJK,你是绝对正确的!!!
      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      相关资源
      最近更新 更多