Композиция точно так же звучит - вы создаете объект, вставляя части.
ИЗМЕНИТЬ, что остальная часть этого ответа ошибочно основана на следующем посылке. Это достигается с помощью интерфейсов. Например, используя вышеприведенный пример Car
,
Car implements iDrivable, iUsesFuel, iProtectsOccupants
Motorbike implements iDrivable, iUsesFuel, iShortcutThroughTraffic
House implements iProtectsOccupants
Generator implements iUsesFuel
Итак, с помощью нескольких стандартных теоретических компонентов вы можете создать свой объект. Это ваша работа, чтобы заполнить, как House
защищает своих обитателей и как Car
защищает своих обитателей.
Наследование походит на все наоборот. Вы начинаете с полного (или полуполного) объекта, и вы заменяете или переопределяете различные биты, которые хотите изменить.
Например, MotorVehicle
может поставляться с методом Fuelable
и Drive
метод. Вы можете оставить метод Fuel так, как он есть, потому что это то же самое, что и заполнять мотоцикл и автомобиль, но вы можете переопределить метод Drive
, потому что Motorbike очень сильно отличается от Car
.
С наследованием некоторые классы уже полностью реализованы, а у других есть методы, которые вы вынуждены переопределять. С составом вам ничего не дано. (но вы можете реализовать интерфейсы, вызывая методы в других классах, если у вас что-то лежит).
Композиция считается более гибкой, потому что, если у вас есть такой метод, как iUsesFuel, вы можете иметь метод в другом месте (другой класс, другой проект), который просто беспокоится о том, чтобы иметь дело с объектами, которые могут подпитываться, независимо от того, это ли автомобиль, катер, плита, барбекю и т. д. Интерфейсы предусматривают, что классы, которые говорят, что они реализуют этот интерфейс, действительно имеют методы, которыми обладает этот интерфейс. Например,
iFuelable Interface:
void AddSomeFuel()
void UseSomeFuel()
int percentageFull()
, тогда у вас может быть метод где-то еще
private void FillHerUp(iFuelable : objectToFill) {
Do while (objectToFill.percentageFull() <= 100) {
objectToFill.AddSomeFuel();
}
Странный пример, но он показывает, что этот метод не заботится о том, что он заполняет, потому что объект реализует iUsesFuel
, он может быть заполнен. Конец истории.
Если вы использовали Inheritance вместо этого, вам понадобятся разные методы FillHerUp
для работы с MotorVehicles
и Barbecues
, если у вас не было какого-то довольно странного базового объекта ObjectThatUsesFuel, из которого унаследовать.
В Kotlin, если Ваш Список строк как это и можно использовать для строки преобразования для ArrayList, используют эту строку кода
var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")