java内部类多继承_内部类和多继承

Java本身不支持多继承,但是在有些场合下,我们却希望一个类能够有多继承的能力,比如使用Facade模式时,Facade类如果能够“多继承”,则Facade类可以简化许多。

配合内部类可以“模拟”多继承,基本的思路是,尽管内部类是单继承的,但是由于可以在外部类中定义多个内部类,这样外部类就可以通过简单的封装内部类的方法间接的实现了多继承。

比如“多功能打印机”,即有打印功能,也有复印功能。首先分别定义打印和复印接口:

/**

* 打印机接口

* @author subaochen

*

*/

public interface Printer {

public void print();

}

/**

* 复印机接口

* @author subaochen

*

*/

public interface Copier {

public void copy();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

* 打印机接口

* @author subaochen

*

*/

publicinterfacePrinter{

publicvoidprint();

}

/**

* 复印机接口

* @author subaochen

*

*/

publicinterfaceCopier{

publicvoidcopy();

}

然后可以如下定义SmartPrinter:

/**

* 智能打印机

* @author subaochen

*

*/

public class SmartPrinter {

public void print(){

new MultiPrinter().print();

}

public void copy(){

new MultiCopier().copy();

}

class MultiPrinter implements Printer{

@Override

public void print() {

System.out.println("multiPrinter print");

}

}

class MultiCopier implements Copier{

@Override

public void copy() {

System.out.println("multiCopier copy");

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

/**

* 智能打印机

* @author subaochen

*

*/

publicclassSmartPrinter{

publicvoidprint(){

newMultiPrinter().print();

}

publicvoidcopy(){

newMultiCopier().copy();

}

classMultiPrinterimplementsPrinter{

@Override

publicvoidprint(){

System.out.println("multiPrinter print");

}

}

classMultiCopierimplementsCopier{

@Override

publicvoidcopy(){

System.out.println("multiCopier copy");

}

}

}

SmartPrinter的测试客户端如下:

/**

* SmartPrinter的测试客户端

* @author subaochen

*

*/

public class SmartPrinterTest {

public static void main(String[] args){

SmartPrinter sp = new SmartPrinter();

sp.print();

sp.copy();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

/**

* SmartPrinter的测试客户端

* @author subaochen

*

*/

publicclassSmartPrinterTest{

publicstaticvoidmain(String[]args){

SmartPrintersp=newSmartPrinter();

sp.print();

sp.copy();

}

}

可以看出,在SmartPrinterTest中,我们只是使用SmartPrinter对象即可同时获得print和copy两个功能,即SmartPrinter类其实是一个Facade类。

当然,代码还可以进一步优化,比如SmartPrinter可以实现其中的一个接口,使得代码显得稍微紧凑一点:

/**

* 智能打印机

* @author subaochen

*

*/

public class SmartPrinter implements Printer{

public void print(){

System.out.println("SmartPrinter print");

}

public void copy(){

new MultiCopier().copy();

}

class MultiCopier implements Copier{

@Override

public void copy() {

System.out.println("multiCopier copy");

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

/**

* 智能打印机

* @author subaochen

*

*/

publicclassSmartPrinterimplementsPrinter{

publicvoidprint(){

System.out.println("SmartPrinter print");

}

publicvoidcopy(){

newMultiCopier().copy();

}

classMultiCopierimplementsCopier{

@Override

publicvoidcopy(){

System.out.println("multiCopier copy");

}

}

}

打印机和复印机也可以是抽象类:

/**

* 打印机基类

* @author subaochen

*

*/

public abstract class Printer {

public void print(){

System.out.println("abstract print");

}

}

/**

* 复印机基类

* @author subaochen

*

*/

public abstract class Copier {

public void copy(){

System.out.println("abstract copy");

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

* 打印机基类

* @author subaochen

*

*/

publicabstractclassPrinter{

publicvoidprint(){

System.out.println("abstract print");

}

}

/**

* 复印机基类

* @author subaochen

*

*/

publicabstractclassCopier{

publicvoidcopy(){

System.out.println("abstract copy");

}

}

这样SmartPrinter就变成了:

public class SmartPrinter extends Printer{

@Override

public void print(){

super.print();

System.out.println("SmartPrinter print");

}

public void copy(){

new MultiCopier().copy();

}

class MultiCopier extends Copier{

@Override

public void copy() {

super.copy();

System.out.println("SmartPrinter copy");

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

publicclassSmartPrinterextendsPrinter{

@Override

publicvoidprint(){

super.print();

System.out.println("SmartPrinter print");

}

publicvoidcopy(){

newMultiCopier().copy();

}

classMultiCopierextendsCopier{

@Override

publicvoidcopy(){

super.copy();

System.out.println("SmartPrinter copy");

}

}

}

d4c39bd54dfbfe627dbd9fe226767b2c.png

0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值