38

我在一次采访中被问到如何在不扩展类的情况下实现动态多态性。如何才能做到这一点?

4

3 回答 3

40

Decorator design pattern that exploits encapsulation is what you're looking for.

Polymorphism through inheritance:

class Cat {
  void meow() {
    // meow...
  }
}
class Lion extends Cat {
}

Polymorphism through encapsulation (Decorator pattern):

interface Cat {
  void meow();      
}
class Lion implements Cat {
  private Cat cat;
  void meow() {
    this.cat.meow();
  }
}

ps. More about decorators: http://www.yegor256.com/2015/02/26/composable-decorators.html

于 2012-09-10T07:27:00.363 回答
30

简单的解决方案是编写一个实现接口而不是扩展基类的类。

另一种解决方案是创建一个动态代理......这本质上是一种无需显式编写类即可实现接口的聪明方法。有关详细信息,请参阅Proxyjavadoc

是的,这些是(或可以是)装饰器模式的示例,尽管这里的关键是实现技术而不是设计模式。

于 2012-09-10T07:30:09.163 回答
3

根据我的经验,在大多数工作面试中,问题不会寻找过于复杂的答案,而且大多数时候只是棘手的问题,所以如果他们专门询问多态性而不扩展类,那么我会说:

是的,您可以通过实现接口而不是扩展类来实现动态多态性

那么如果他们要求更多的选择,那么提出代理、模式或其他东西就可以了。

希望能帮助到你!

于 2012-09-10T15:51:59.743 回答