一个关于接口实现多重继承的问题,???
有一个a类,一个b类,现想自己写一个c类来继承a、b的方法,在c++中可以直接实现
多重继承,在java中要用到interface实现,但在实现时,要在c类中全部重写接口的方法
。这不是违背了oop重复利用代码的原则吗?如果a或b类中的一个方法我不知它的方法体
如何自己写呀,本人初学java对接口间接实现多继承有些迷茫。望高手指点。
推荐阅读
接口最重要的功能就是多态性。
如果那个a类和b类是可以修改的就好办了。
你完全可以重新设计一下这两个类。
一个方法就是分别让他们实现各自的方法接口interfacea和interfaceb,这两个接口自己定义就行了.然后你可以让c来实现interfacea和interfaceb就可以了。
oop的思想并不是楼主所说的共享类方法,实质上更偏向于共享类属性。
如果a和b中没有可供c共享的属性或者很少,而只是方法接口有联系,那么这说明一个问题:你的类模块建立的逻辑不规范,没有实现所谓的强内聚弱耦合的oop原则。
如果你是就事论事,那么你可以把你的源代码贴出来让大家分析一下。
继承是种强耦合,楼主遇到的问题还是类与类之间的关系。要搞清这些问题关键还是要先理解面向对象和面向对象的设计。
我就简单说明一下好了!
类之间有4种重要的关系:依赖、泛化、关联和实现。这些关系都可以映射到代码里。
1)依赖:关系对象出现在局部变量或者方法的参数里,或者关系类的静态方法被调用
2)关联:关系对象出现在实例变量中
3)泛化:extends
4)实现:implements
对应到代码中,依赖关系可能有很多种形式,例如
public class a
{
public b getb(c c, d d)
{
e e = new e();
b b = new b(c, d, e);
}
}
这里类a就依赖于类b、c和d、e,因为这几个类的变化都有可能影响到类a
泛化是一般事物和较特殊的事务之间的关系,对类来说一般就是继承了,如:public class a extends b。
关联是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。给定一个连接两各类的关联,可以从一个类的对象导航到另一个类的对象。关联可以有方向,即导航。一般不作说明的时候,导航是双向的,大部分情况下导航是单向的。
关联在代码中一般表示为属性,例如
public class a
{
private b b;
}
可以认为有一个a指向b的关联。如果b也关联到a,那么它们就是双向的关联。
有的时候b不是a的属性,但是也可以有关联关系,例如:
public class a
{
public b[] getbs()
{...}
}
方法getbs可能去查数据库,找到a和b之间的关联关系。
两个类之间的简单关联表示了两个同等地位类之间的结构关系。聚合也是一种关联关系,与简单关联不同的是,它描述的是一个整体和组成部分的关系,即“has-a”关系,意思是整体对象拥有部分对象,例如学校和学生的关系。聚合的整体和部分之间在生命周期上没有什么必然的联系,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁之后销毁。
public class person
{...}
public class school
{
private arraylist students;
private void addstudent(person person)
{
students.add(person);
}
}
组合则是比聚合更强的关联形式。组合是指带有很强的拥有有关系且整体与部分的生命周期一致的聚合关联形式。例如windows的窗口和窗口上的菜单就是组合关系。生命周期一致指的是部分必须在组合创建的同时或者之后创建,在组合销毁之前或者同时销毁,部分的生命周期不会超出组合的生命周期。
public class menu
{...}
public class window
{
private menu menu;
}
组合和聚合在代码实现上的主要差别在于生命周期的实现上,组成需要负责其部分的创建和销毁。
public class school
{
public school()
{...}//不需要创建任何person对象,其students都是已有的person对象
public void destroy()
{...}//只需要关掉school对象和断开它与自己所有的person对象的关联即可,person对象是不会销毁的
}
public class window
{
private menu menu;
public window()
{
menu = new menu();
}//可以在这时候创建menu对象,也可以在之后创建
public void destory()
{
menu.destory();
}//必须同时或者在这之前销毁关联的menu对象
}
另外有一个差别是组合中的一个对象在同一时刻只能属于一个组成对象,而聚合的一个部分对象可以被多个整体对象聚合,例如一个学生可以在多个学校就读,而一个菜单在同一时刻只能是某个窗口内的对象。
实现关系就比较简单了,指的是一个类元描述了另一个类元保证实现的契约。对类来说,就是一个类实现了一个接口
public interface a
{
public void methoda();
}
public class b implements a
{
public void methoda()
{...}
...
}
一般在面对对象的系统中,尽可能的使用接口来减少类之间的耦合。因为接口没有实现,所以依赖于接口就不会依赖于某种具体实现,例如jdbc里的connection和resultset都是接口,不同数据库厂商的实现可以不一样。
think in java 里是这么说的:
有关联的类a与类b的关系有包含与属于两种。
如果是a包含b就在b类中用实例化一个a类的对象来实现。
如果是b属于a则通过b类继承a类来实现。
类本身不支持多继承。所以java用接口来实现多态。
在接口c中只有域和方法的申明。但没有方法的具体实现代码。引用a,b类的方法是通过作为方法的参数来实现。
我看你要的功能可以通过c类包含a,b类的实例来实现呀。


讨论区