让多重继承成为现实

简介:

建议41: 让多重继承成为现实

在Java中一个类可以多重实现,但不能多重继承,也就是说一个类能够同时实现多个接口,但不能同时继承多个类。但有时候我们确实需要继承多个类,比如希望拥有两个类的行为功能,就很难使用单继承来解决问题了(当然,使用多层继承是可以解决的)。幸运的是Java中提供的内部类可以曲折地解决此问题,我们来看一个案例,定义一个父亲、母亲接口,描述父亲强壮、母亲温柔的理想情形,代码如下:

复制代码
1 //父亲  
2 interface Father{  
3    public int strong();  
4 }  
5 //母亲  
6 interface Mother{  
7    public int kind();  
8 } 
复制代码

其中strong和kind的返回值表示强壮和温柔的指数,指数越高强壮度和温柔度也就越高,这与在游戏中设置人物的属性值是一样的。我们继续来看父亲、母亲这两个实现:

复制代码
 1 class FatherImpl implements Father{  
 2      //父亲的强壮指数是8  
 3      public int strong(){  
 4           return 8;  
 5      }  
 6 }  
 7  
 8 class MotherImpl implements Mother{  
 9      //母亲的温柔指数是8  
10      public int kind(){  
11           return 8;  
12      }  
13 } 
复制代码

父亲强壮指数是8,母亲温柔指数也是8,门当户对,那他们生的儿子、女儿一定更优秀了,我们先来看儿子类,代码如下:

复制代码
 1 class Son extends FatherImpl implements Mother{  
 2      @Override  
 3      public int strong(){  
 4          //儿子比父亲强壮  
 5          return super.strong() + 1;  
 6      }  
 7  
 8      @Override  
 9      public int kind(){  
10           return new MotherSpecial().kind();  
11      }  
12  
13      private class MotherSpecial extends MotherImpl{  
14           public int kind(){  
15             //儿子温柔指数降低了  
16             return super.kind() - 1;  
17         }  
18      }  
19 } 
复制代码

儿子继承自父亲,变得比父亲更强壮了(覆写父类strong方法),同时儿子也具有母亲的优点,只是温柔指数降低了。注意看,这里构造了MotherSpecial类继承母亲类,也就是获得了母亲类的行为方法,这也是内部类的一个重要特性:内部类可以继承一个与外部类无关的类,保证了内部类的独立性,正是基于这一点,多重继承才会成为可能。MotherSpecial的这种内部类叫做成员内部类(也叫做实例内部类,Instance Inner Class)。我们再来看看女儿类,代码如下:

复制代码
 1 class Daughter extends MotherImpl implements Father{  
 2  
 3      @Override  
 4      public int strong() {  
 5           return new FatherImpl(){  
 6             @Override  
 7             public int strong() {  
 8                 //女儿的强壮指数降低了  
 9                 return super.strong() - 2 ;  
10             }  
11         }.strong();  
12      }  
13 } 
复制代码

女儿继承了母亲的温柔指数,同时又覆写父类的强壮指数,不多解释。注意看覆写的strong方法,这里是创建了一个匿名内部类(Anonymous Inner Class)来覆写父类的方法,以完成继承父亲行为的功能。

多重继承指的是一个类可以同时从多于一个的父类那里继承行为与特征,按照这个定义来看,我们的儿子类、女儿类都实现了从父亲类、母亲类那里所继承的功能,应该属于多重继承。这要完全归功于内部类,诸位在需要用到多重继承时,可以思考一下内部类。

在现实生活中,也确实存在多重继承的问题,上面的例子是说后人即继承了父亲也继承了母亲的行为和特征,再比如我国的特产动物“四不像"(学名麋鹿),其外形“似鹿非鹿,似马非马,似牛非牛,似驴非驴”,这你要是想用单继承表示就麻烦了,如果用多继承则可以很好地解决问题:定义鹿、马、牛、驴四个类,然后建立麋鹿类的多个内部类,继承它们即可。


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5433057.html,如需转载请自行联系原作者

相关文章
|
5月前
|
存储 编译器 C++
C++:多态究竟是什么?为何能成为面向对象的重要手段之一?
C++:多态究竟是什么?为何能成为面向对象的重要手段之一?
65 0
|
Java
Java面向对象三大特性之多态及综合练习
Java面向对象三大特性之多态及综合练习
96 0
|
2月前
|
存储 Java 开发者
抽象类和接口,你不知道的秘密!Java编程新视角
抽象类和接口,你不知道的秘密!Java编程新视角
34 5
|
2月前
|
Java 程序员
抽象类与接口的隐藏力量!揭秘Java编程
抽象类与接口的隐藏力量!揭秘Java编程
36 3
|
16天前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
5月前
|
设计模式 算法 编译器
C++中的多态性技术
C++中的多态性技术
|
4月前
|
存储 Java 开发者
Java编程新视角:抽象类和接口,你不知道的秘密!
【6月更文挑战第17天】在Java中,抽象类与接口是抽象概念的关键工具。抽象类是不可实例化的模板,包含抽象和具体方法,适合有层次结构的继承;接口仅含抽象方法,像契约般规定实现类的行为,适用于无关对象间的统一接口。Java类单继承但可多实现接口,增加设计灵活性。理解并巧妙运用二者,能提升代码质量和可维护性。
26 0
|
5月前
|
Java 编译器 C#
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
133 1
|
5月前
|
JavaScript 前端开发
掌握构造函数:打破面向对象编程难题(一)
掌握构造函数:打破面向对象编程难题
|
5月前
|
JavaScript 前端开发 程序员
掌握构造函数:打破面向对象编程难题(二)
掌握构造函数:打破面向对象编程难题