Итак, я начал изучать книгу, которая называется «шаблон проектирования головы», и в ее начальной главе был приведен сценарий, в котором композиция предпочтительнее, чем унаследование, на примере класса утки. различными типами уток, а также ненастоящей резиновой уткой.
(в зависимости от типа утки)
Duck obj=new IndoDuck();
//Or
//Duck obj =new MallardDuck();
obj.Swim();
obj.Look();
Так что до сих пор это выглядит хорошо.
Теперь пришло изменение, добавив к уткам поведение Flying.
Мы не можем просто добавить поведение метода fly к абстрактному классу утки, так как существуют поддельные утки, которые не могут летать.
Поэтому автор создает интерфейс IFly, который будет реализован классом Flyable и классом NonFlyable.
interface IFly
{
Fly();
}
Flyable: IFly
{
Fly()
{
// can fly
}
}
NonFlyable:IFly
{
Fly()
{
// cant fly
}
}
Так что этот интерфейс IFly не будет реализован всеми различными классами уток, так как это будет серьезным изменением для добавления flyable/ Нелетное поведение к этим уткам. Так что уныние кажется не очень хорошей идеей, согласитесь.
Автор предполагает, что интерфейс IFly будет использоваться внутри класса Duck в качестве композиции.
public abstract class Duck
{
Swim()
{
//all ducks can swim same way
}
abstract Look();// ducks can look different
IFly Fly();
}
Так что теперь я могу это сделать.
Duck obj=new IndoDuck();
//Or
//Duck obj =new MallardDuck();
obj.Swim();
obj.Look();
obj.Fly =new Flyable();
//or
obj.Fly=new NonFlyable();
поэтому мой вопрос в том, как бы я узнал, основываясь на типе, если функциональность Flyable добавить или NonFlyable, как где-нибудь, я должен сказать каждому классу утки, что они либо летают, либо не правы ?? Так как же композиция действительно решает проблему, которую я здесь не могу связать, или я что-то пропустил? Пожалуйста, помогите.