问题描述
配置选项接口:publicinterfaceDataSourceConfigureextendsjava.io.Serializable,ServiceProvider{publicStringgetName();publicvoidsetName();/***获得扩展属性名*@return*/publicString[]getExtPropertyNames();publicObjectgetExtProperty(Stringname);publicvoidsetExtProperty(Stringname,Objectvalue);/***方便序列化,扩展字符串属性扩展*@paramname*@return*/publicStringgetExtPropertyAsString(Stringname);publicvoidsetExtPropertyAsObject(Stringname,Stringvalue);}
持久化接口publicinterfaceDataSourceRepository{publicMap<String,DataSourceConfigure>getAll();publicbooleansave();publicintload();publicbooleanadd(Stringname,DataSourceConfigureconfig);publicbooleanremove(Stringname);publicbooleanupdate(Stringname,DataSourceConfigureconfig);publicDataSourceConfigurefind(Stringname);}
配置选项有两个实现类,一个C3P0,一个Druid,在持久化实现类中我怎么知道add(Stringname,DataSourceConfigureconfig)传入的DataSourceConfigure具体是哪个实现类的?
解决方案
解决方案二:
你不用知道,这就是接口存在的意义。否则抽象出一个接口来干嘛,都extendsobject好了
解决方案三:
但是我实现类中放了其他一些属性啊,我怎么取出来啊。
解决方案四:
接口就是对客户类封装实现类,将对实现类的操作体现到接口类上述情况应该在接口类中添加抽象的属性访问方法
解决方案五:
引用2楼thewayuare的回复:
但是我实现类中放了其他一些属性啊,我怎么取出来啊。
调用接口的方法取值,非要知道是哪个实现类,用instanceof不就知道了
解决方案六:
如果你要将参数定义成某个接口,那你的实现就应该只针对这个接口。如果要引用其他的属性,你可以继续往接口中添加方法,或者用抽象类再封装一次。
解决方案七:
理想状态下,你不应该知道是哪个实现类,你使用接口,就是使用接口里定义的方法,之所以“面向接口编程”,就是要屏蔽掉具体实现类,因为具体实现类都会实现所有的接口方法,因此理论上不会影响你使用这个接口。如果你一定要使用具体实现类里的东西,那有两种情况,一种是设计不合理,这种情况不讨论了,要么改设计,要么就对付着用instanceof判断然后强转;另一种是设计合理的,比如工厂模式,使用具体类的那个类也是一个特定实现,在这个实现类里一定是使用另一个具体实现类的,如果那个类不是期望的具体实现类,就不是设计初衷了。这种情况下一般用instanceof判断一下,如果传入进来的不是特定实现,就抛出异常,如果是预期的特定实现,就强转后使用。