Объектно-ориентированные отношения - PullRequest
4 голосов
/ 17 августа 2010

Меня попросили описать отношения между транспортным средством, автомобилем, Toyota в терминах объектно-ориентированного программирования (скажем, в среде php).Я был в тупике.Может ли кто-нибудь помочь мне об этом?Спасибо ...

Ответы [ 15 ]

22 голосов
/ 17 августа 2010

Я думаю, что Toyota относится к компании.

Я бы сказал:

Автомобиль - это объект, а Автомобиль - это тип Транспортного средства. Toyota является конкретным разработчиком объектов Vehicle с методом brake, перегруженным для возврата false.

5 голосов
/ 17 августа 2010

Автомобиль - это автомобиль, а автомобиль Toyota - это автомобиль.

Самое простое утверждение состоит в том, что car может быть подклассом vehicle, а toyota car может быть подклассом car.

Конечно, Toyota также может относиться к компании, и в этом случае все будет немного иначе.Я уверен, что параграф выше - это то, что они ожидали услышать.

4 голосов
/ 17 августа 2010

Автомобиль - это тип транспортного средства - так что вы можете думать о Vehicle как о базовом классе Car.

Тойота производит автомобили. Вместо того чтобы делать это наследственным отношением, я бы склонялся добавить manufacturer переменную-член к Vehicle. Затем для экземпляров Car, производимых Toyota, установите car.manufacturer = "Toyota".

3 голосов
/ 17 августа 2010

Просто, чтобы быть неловким: автомобиль является подклассом транспортного средства, как и грузовик. Тойота - производитель, который делает и легковые и грузовые автомобили; поэтому Toyota должна быть одним из нескольких потенциальных значений для атрибута производителя транспортного средства.

class Vehicle{ 

   protected $_model;

   protected $_manufacturer;

   public __construct($manufacturer) {
       $this->_manufacturer = $manufacturer;
   }
} 

class Car extends Vehicle{ 
   public __construct($model,$manufacturer) {
       parent::__construct($manufacturer);
   }
   $this->_model = $model;
} 

class Truck extends Vehicle{ 
   public __construct($model,$manufacturer) {
       parent::__construct($manufacturer);
   }
   $this->_model = $model;
} 

$a = new Car('Avensis','Toyota');
$b = new Truck('Land Cruiser','Toyota');
2 голосов
/ 17 августа 2010

Самый простой способ думать об этом - это логическая иерархия того, с чем вы работаете.И это применимо практически ко всему на свете.То, что все сказали здесь, является точным, но это может не помочь вам понять, что они говорят, если вы не понимаете ООП.Итак, позвольте мне уточнить.

Транспортное средство: Транспортное средство может быть любым видом транспорта.Имейте в виду, что это может быть самолет, поезд, автомобиль, велосипед, баллон с горячим воздухом и т. Д. Транспортное средство - это то, что используется для доставки вас из одного места в другое.Таким образом, базовый класс, являющийся транспортным средством, говорит вам, что это будет транспортное средство.

Автомобиль. Автомобиль - это форма транспортного средства.Таким образом, он расширяет автомобиль.Автомобиль может быть описан как транспортное средство с 4 колесами, 2-мя дверями (в зависимости от автомобиля), двигателем, рулем, дворниками, фарами, поворотниками, тормозами, акселератором и т. Д. Таким образом, автомобиль дополнительно описывает, какое у вас транспортное средство.Ссылаясь на.

Тойота: Тойота это форма автомобиля.Таким образом, он расширяет автомобиль.(Это также может расширить грузовик, если вы работаете с классом грузовиков).Есть определенные элементы тойоты, которые могут не подходить для каждого автомобиля.Таким образом, чтобы помочь определить тип автомобиля, Toyota может указать пробег, количество дверей, цвет, размер двигателя и т. Д.

Надеюсь, это поможет.

2 голосов
/ 17 августа 2010

Автомобиль базового класса. Автомобиль является производным классом. Toyota (вероятно) - это значение, которое можно присвоить «брендовому» представителю класса Vehicle. Теоретически, вы можете получить Toyota из автомобиля (или что-то в этом роде), но IMO это обычно плохая идея. Как правило, деривация должна отражать функцию, и функции, привязанной к бренду, мало.

2 голосов
/ 17 августа 2010

«Автомобиль» - это базовый класс, «Автомобиль» - это класс, который расширяет, наследует или является производным от «Транспортного средства» (в зависимости от используемого языка), и в идеале «Тойота» должна быть значениемсвойство "brand" или "make" одного из этих двух классов.

2 голосов
/ 17 августа 2010

Вы имели в виду:

class Vehicle{
}

class Car extends Vehicle{
}

class Toyota extends Car{
}
1 голос
/ 17 августа 2010

Конечно, это не тот ответ, который хотел бы услышать ваш интервьюер, но цель объектно-ориентированного программирования - не моделировать весь мир, а просто предоставить абстрактные типы данных, которые моделируют конкретные понятия в домен вашей заявки .

Следовательно, отношения между ними полностью зависят от того, какое приложение вы делаете. Вполне возможно, что автомобиль и машина должны быть класса того же . Многим приложениям может быть все равно, какой это тип автомобиля. Им также может быть все равно, что это за марка , что также позволяет вам выбросить класс Toyota.

ООП мог бы быть полезным инструментом, если бы его не взяли в заложники идиоты, считавшие, что целью программирования является создание диаграммы UML для всей вселенной.

1 голос
/ 17 августа 2010

Мое мнение: «Тойота» не должна быть производной от «автомобиля», потому что Тойота - это компания, а не конкретная машина."Toyota_car" может быть получен из "автомобиля".«Тойота» должна быть производной от класса «производитель», который является производным от класса «компания».Класс «vehicle» должен иметь член класса, указывающий на класс «производитель».В случае автомобиля, произведенного Toyota, экземпляр объекта класса «автомобиль» должен иметь этот унаследованный член класса, указывающий на объект Singleton типа класса «toyota».(C ++)

...