例如我有
class Louie extends Chinese
abstract class Chinese implements Human
interface Human
我应该将 Louie objecta 声明为 Human、Chinese 还是只是 Louie?
我还注意到的一件事是对象变量的范围不一样。例如,如果我有一个中文名称变量和一个路易的名称变量
例如我有
class Louie extends Chinese
abstract class Chinese implements Human
interface Human
我应该将 Louie objecta 声明为 Human、Chinese 还是只是 Louie?
我还注意到的一件事是对象变量的范围不一样。例如,如果我有一个中文名称变量和一个路易的名称变量
这取决于你想对这个项目做什么。
如果接口有一个方法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)
{
}
等等。这一切都取决于上下文
超类型的变量可以保存子类型的引用。
这表示:
Human h = new Louie();
Chinese c = new Louie();
Louie lui = new Louie();
都是有效的。但:
h
只能访问Human
接口中声明的方法/字段。c
可以访问Human
接口和Chinese
类中的方法/字段。lui
Human
可以访问接口、Chinese
类和类中的方法/字段Louie
。现在,为了简单起见,只创建那种没有额外访问权限的引用,除非需要。
例如:您只对Human
接口方法感兴趣,然后创建一个类型为 的变量Human
。
Should I declare Louie objecta as Human, Chinese or just Louie?
简单的答案是肯定的。
但请注意
1.如果您声明Louie objecta as Human
您Human
只能使用行为。
2.如果您声明Louie objecta as Chinese
您只能同时使用Chinese
和Human
行为。
3.如果您声明Louie objecta as Louie
您可以使用所有Chinese
,Human
和Louie
行为。
所以这完全取决于你的要求。
Louie 对象可以声明为 Human、Chinese 或只是 Louie。将是您的选择,取决于要求。这就是形式polymorphism
。
所以 Louie 对象可以采用任何形式的 Human、Chinese 或 Louie,但该对象的范围将受到您映射到的类型的限制。