锁定老帖子 主题:子类父类实现同一接口
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-10-12
最后修改:2010-10-12
allskylove 写道 光从上面的代码中看不出来什么? 因为我看不到 B类中的实现 和C类中的实现
自己试一下,并不是楼上说的没有用, 比如说:使用了静态变量,私有变量,公共变量,静态方法,私有方法,等等,; 另外 类继承 和实现 是两个层次的东西,没有办法比较, 属于语言设计的问题。 接口比类更抽象,更高级。 借问仁兄能不能详细解释呢? interface A { } class B implements A { } class C extends B implements A { } 子类已经继承了父类的行为。C 在这里implements A和不implements A有啥区别的呢? 个人觉得这里实现A接口,只能会是代码质量低下(代码读起来有点怪),举个例子 interface A { void f() throws Exception; } class B implements A { public void f() throws IOException {} } class C extends B implements A { public void f() throws Exception {} } 如果只看接口A中抛出的异常是Exception,那C实现A接口,抛出Exception无可后妃。但这里C编译是通不过的,因为B已经改变了f的“异常范围”,所以个人认为,C的实现接口A是没任何意义的。。。。 |
|
返回顶楼 | |
发表时间:2010-10-12
lewisw 写道 感觉没有用, 或许对一些声明作用的接口有用,如Serializable, Cloneable等等
比如 public class A implements Serializable { } public class B extends A { } public class C extends A implements Serializable { } B类是不是也是能序列化? 谁做下测试 不用测试,肯定是序列化了的。。。。因为B继承了A。。。复核“IS A”的定义 |
|
返回顶楼 | |
发表时间:2010-10-12
kimmking 写道 allskylove 写道 光从上面的代码中看不出来什么? 因为我看不到 B类中的实现 和C类中的实现
自己试一下,并不是楼上说的没有用, 比如说:使用了静态变量,私有变量,公共变量,静态方法,私有方法,等等,; 另外 类继承 和实现 是两个层次的东西,没有办法比较, 属于语言设计的问题。 接口比类更抽象,更高级。 有鬼的区别~ 严重同; 变量,静态方法,似有方法都没有继承关系。何谈影响? |
|
返回顶楼 | |
发表时间:2010-10-12
allskylove 写道 kala888 写道 allskylove 写道 光从上面的代码中看不出来什么? 因为我看不到 B类中的实现 和C类中的实现
自己试一下,并不是楼上说的没有用, 比如说:使用了静态变量,私有变量,公共变量,静态方法,私有方法,等等,; 另外 类继承 和实现 是两个层次的东西,没有办法比较, 属于语言设计的问题。 接口比类更抽象,更高级。 借问仁兄能不能详细解释呢? interface A { } class B implements A { } class C extends B implements A { } 子类已经继承了父类的行为。C 在这里implements A和不implements A有啥区别的呢? 个人觉得这里实现A接口,只能会是代码质量低下(代码读起来有点怪),举个例子 interface A { void f() throws Exception; } class B implements A { public void f() throws IOException {} } class C extends B implements A { public void f() throws Exception {} } 如果只看接口A中抛出的异常是Exception,那C实现A接口,抛出Exception无可后妃。但这里C编译是通不过的,因为B已经改变了f的“异常范围”,所以个人认为,C的实现接口A是没任何意义的。。。。 有用的,你再想想,给你创新思维的机会,等我说出来,可能你没有啥成就感,我怕我说出来后打击大家的积极性。 跪 求打击。。。 |
|
返回顶楼 | |
发表时间:2010-10-12
想想设计模式中,这么做的又几种?装饰器和代理都可以通过这种方式实现。楼主说的这样做法,可以用来解决动态增加功能和代理功能。
|
|
返回顶楼 | |
发表时间:2010-10-12
新手弱弱的问一句 如果B是abstract类 不是可以不完全实现接口A里的方法么? 这样的话B可以作为接口A的修改和补充 某一C类需要B和A的完全实现 依我看来 单纯这两句看不出什么 争议性太大了 例如这样:
public interface A { void Atest1(); void Atest2(); void Atest3(); } public abstract class B implements A { @Override public void Atest1() { } @Override public void Atest2() { } public void Btest1(){ } } public class C extends B implements A { @Override public void Atest3() { } } |
|
返回顶楼 | |
发表时间:2010-10-12
最后修改:2010-10-12
vivus 写道
子类父类实现同一接口有什么作用?
简单的说,下面这样的代码: B implements A C extends B implements A 红色的代码有什么用?
public interface PropertyAccessor { } public interface PropertyEditorRegistry { } public interface ConfigurablePropertyAccessor extends PropertyAccessor,PropertyEditorRegistry { } public interface BeanWrapper extends ConfigurablePropertyAccessor { } public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { } public abstract class AbstractPropertyAccessor extends PropertyEditorRegistrySupport implements ConfigurablePropertyAccessor { } public class BeanWrapperImpl extends AbstractPropertyAccessor implements BeanWrapper { } /* 上面整个类结构的设计先忽略掉,仅关注接口PropertyAccessor,抽象类AbstractPropertyAccessor,具体类BeanWrapperImpl 下面是接口PropertyAccessor定义的完整方法 */ public interface PropertyAccessor { boolean isReadableProperty(String propertyName) throws BeansException; boolean isWritableProperty(String propertyName) throws BeansException; Class getPropertyType(String propertyName) throws BeansException; Object getPropertyValue(String propertyName) throws BeansException; void setPropertyValue(String propertyName, Object value) throws BeansException; void setPropertyValue(PropertyValue pv) throws BeansException; void setPropertyValues(Map map) throws BeansException; void setPropertyValues(PropertyValues pvs) throws BeansException; void setPropertyValues(PropertyValues pvs, boolean ignoreUnknown) throws BeansException; } /* 仔细研究这个接口中的方法,可以发现两个setPropertyValue重载方法及三个setPropertyValues重载方法, 在这五个方法中除了setPropertyValue(String,Object)之外其余四个方法都可以建立在此方法基础上进行实现. 这也正是抽象类AbstractPropertyAccessor做的工作之一. 基础方法setPropertyValue(String,Object)留在具体类BeanWrapperImpl中进行实现. */
|
|
返回顶楼 | |
发表时间:2010-10-13
其实这样写并不是概念性的东西,而是有实际效果的。
在反射的时候,这样写可能就是不同的结果了。 比如在调用Class#getInterfaces()时,如果有接口A,实现类B实现接口A,类C继承B但是没显示implements A,有类D继承B并且implements A。 这个时候如果对C用getInterfaces(),是个空数组,对C用getInterfaces()就能得到A |
|
返回顶楼 | |
发表时间:2010-10-13
在代码表现上,可以清晰的看到C类实现了A接口,而不需要通过基类B知道
|
|
返回顶楼 | |
发表时间:2010-10-13
按照Java Collection Framework的设计,如
interface Map<K, V>{} abstract AbstractMap<K, V> implements Map<K,V>{} class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>{} AbstractMap充当骨架,实现某些共用的功能,Map接口充当标识,在这里抽象类AbstractMap在设计上应该不是一个纯粹的父类,HashMap is-a AbstractMap?这感觉不太妥.HashMap再implements Map接口,应该只是为了强化HashMap拥有Map这个标识,而不是让人觉得HashMap只是AbstractMap的一个子实现类.让人更容易将HashMap, LinkedHashMap, TreeMap之类拥有Map标识的类关联起来.这应该只是一种设计意图,在语法上其实是不必要的. 个人推断 |
|
返回顶楼 | |