java 组合优与继承,为什么继承是强耦合的,因为组合在Java中松散耦合?

I have heard this favor composition over inheritance again and again in design patterns. some of the reasons cited for this are

1)Inheritance is strongly coupled where as composition is loosely coupled

2) Inheritance is compile time determined where as composition is run-time

3)Inheritance breaks encapsulation where as composition does not

4) anything else I am not aware of

It would be great for beginners like to me follow these by illustrations as how inheritance and composition differs with respect to above points. I have read various SO links that talks about them, but walk through examples on these key points would be great for Java beginners.

I think it is very crucial to understand the difference clearly than just memorizing the points.

解决方案

Nice question and big for a beginner, I think I should first remind inheritance and composition, and then go to explain what is exactly Favor Composition over Inheritance does means.

prose and cons of inheritance :

Advantages:

One of the prime benefits of dynamic binding and polymorphism is that

they can help make code easier to change

New implementation is easy, since most of it is inherited Easy to

modify or extend the implementation being reused.

Disadvantages:

Breaks encapsulation, since it exposes a subclass to implementation

details of its super-class

White-box reuse, since internal details of super-classes are often

visible to subleases.

Subclasses may have to be changed if the implementation of the

superclass changes Implementations inherited from superclasses can

not be changed at runtime.

About the question:

Inheritance is strongly coupled where as composition is loosely coupled

Inheritance will bring you tight coupling, simply one change to base class can break many child classes.

But when to use and how detect we need inheritance or composition?

Use inheritance only when all of the following criteria are satisfied (Coad's Rule):

A subclass expresses is a special kind of and not is a role played by a.

An instance of a subclass never needs to become an object of another class

A subclass extends, rather than overrides or nullifies, the responsibilities of

its super-class

A subclass does not extend the capabilities of what is merely a

utility class

For a class in the actual Problem Domain, the subclass specializes

a role, transaction or device

Inheritance is compile time determined where as composition is run-time

When compiled, your base class codes will be added to every child class.

Inheritance breaks encapsulation where as composition does not

Yes .see the disadvantage of inheritance .

The bottom line is :

Make sure inheritance models the is-a relationship

My main guiding philosophy is that inheritance should be used only when a subclass is-a superclass. In the example above, an Apple likely is-a Fruit, so I would be inclined to use inheritance.

An important question to ask yourself when you think you have an is-a relationship is whether that is-a relationship will be constant throughout the lifetime of the application and, with luck, the lifecycle of the code. For example, you might think that an Employee is-a Person, when really Employee represents a role that a Person plays part of the time. What if the person becomes unemployed? What if the person is both an Employee and a Supervisor? Such impermanent is-a relationships should usually be modelled with composition.

Don't use inheritance just to get code reuse

If all you really want is to reuse code and there is no is-a relationship in sight, use composition.

Don't use inheritance just to get at polymorphism

If all you really want is polymorphism, but there is no natural is-a relationship, use composition with interfaces.

Favor composition Over Inheritance :)

I took it straight from the javaworld.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值