Java多重继承实现方法
程序员文章站
2022-07-15 17:13:13
...
我们都知道,在Java中一个类可以多重实现,但是不能多重继承。也就是说一个类可以同时实现多个接口,但不能同时继承多个类。有时候我们需要让一个类同时拥有多个类的行为功能。这时候使用单继承特性就很难解决问题了。幸运的是Java提供的内部类可以用来解决此问题。
内部类的一个重要特性:内部类可以继承一个与外部类无关的类,保证了内部类的独立性,正是基于这一点, 多重继承才会成为可能。这种内部类叫做成员内部类(也叫做实例内部类,Instance Inner Class)。
明白了一些简单的原理,下面来看一个案例:在游戏人物设定中,通常子女的属性值受父亲和母亲的属性值影响。其中父亲为敏捷值突出,母亲恢复值突出。定义一个父亲、母亲接口,用于描述父亲敏捷值和母亲恢复值。代码如下:
// 父亲
public interface Father {
// 敏捷
int agile();
}
// 母亲
public interface Mother {
// 恢复
int recover();
}
再定义父亲、母亲的实现:
// 父亲实现
public class FatherImpl implements Father {
// 父亲敏捷值为8
@Override
public int agile() {
return 8;
}
}
// 母亲实现
public class MotherImpl implements Mother {
// 母亲恢复值为8
@Override
public int recover() {
return 8;
}
}
下面我们来定义儿子类,儿子需要同时继承父亲的敏捷和母亲的恢复功能,代码如下:
public class Son extends FatherImpl implements Mother {
// 儿子敏捷值在父亲基础上+1
public int agile() {
return super.agile() + 1;
}
@Override
public int recover() {
return new MotherImplAttr().recover();
}
private class MotherImplAttr extends MotherImpl {
public int recover() {
// 儿子恢复值在母亲基础上-1
return super.recover() - 1;
}
}
}
同样我们可以用匿名内部类来覆写父类方法,继承父类行为。再来定义个女儿类:
public class Daughter extends MotherImpl implements Father {
// 女儿恢复值在母亲基础上+1
public int recover() {
return super.recover() + 1;
}
@Override
public int agile() {
return new FatherImpl() {
public int agile() {
// 女儿敏捷值在父亲基础上-1
return super.agile() - 1;
}
}.agile();
}
}
测试:
public static void main(String[] args) {
Son son = new Son();
System.out.println("儿子敏捷值:" + son.agile());
System.out.println("儿子恢复值:" + son.recover());
System.out.println("************");
Daughter daughter = new Daughter();
System.out.println("女儿敏捷值:" + daughter.agile());
System.out.println("女儿恢复值:" + daughter.recover());
}
结果:
于是在面对麋鹿(四不像)其外形“似鹿非鹿,似马非马,似牛非牛,似驴非驴”的情形你就能很好的解决问题了,只需定义鹿、马、牛、驴四个类,建立麋鹿类的多个内部类,继承他们即可。