1

例如我有

class Louie extends Chinese

abstract class Chinese implements Human

interface Human

我应该将 Louie objecta 声明为 Human、Chinese 还是只是 Louie?

我还注意到的一件事是对象变量的范围不一样。例如,如果我有一个中文名称变量和一个路易的名称变量

4

4 回答 4

1

这取决于你想对这个项目做什么。

如果接口有一个方法IA(),抽象超类有方法B(),而路易类有两个和方法的实现,C()那么:

如果您只需要使用IA()我会做的方法:

Human h = new Louie();

如果您需要使用B()我会这样做:

Chinese c = new Louie();

如果我C()也需要,我会这样做:

Louie l = new Louie();

其背后的原因是每个人都清楚我需要从这个实例中得到什么。另外,在我Louie上课时的方法中,它再次取决于我在什么上下文中得到它。如果我得到Louie一种处理或需要处理所有的方法,Human我将签署:

public void DealWithHuman(Human h)
{
}

等等。这一切都取决于上下文

于 2013-08-25T07:31:51.713 回答
1

超类型的变量可以保存子类型的引用。

这表示:

Human h = new Louie();
Chinese c = new Louie();
Louie lui = new Louie();

都是有效的。但:

  1. h只能访问Human接口中声明的方法/字段。
  2. c可以访问Human接口和Chinese类中的方法/字段。
  3. luiHuman可以访问接口、Chinese类和类中的方法/字段Louie

现在,为了简单起见,只创建那种没有额外访问权限的引用,除非需要。

例如:您只对Human接口方法感兴趣,然后创建一个类型为 的变量Human

于 2013-08-25T08:08:17.013 回答
0

Should I declare Louie objecta as Human, Chinese or just Louie?
简单的答案是肯定的。

但请注意

1.如果您声明Louie objecta as HumanHuman只能使用行为。

2.如果您声明Louie objecta as Chinese您只能同时使用ChineseHuman行为。

3.如果您声明Louie objecta as Louie您可以使用所有Chinese,HumanLouie行为。

所以这完全取决于你的要求。

于 2013-08-25T07:50:32.750 回答
0

Louie 对象可以声明为 Human、Chinese 或只是 Louie。将是您的选择,取决于要求。这就是形式polymorphism

所以 Louie 对象可以采用任何形式的 Human、Chinese 或 Louie,但该对象的范围将受到您映射到的类型的限制。

于 2013-08-25T07:26:13.513 回答