在asp.net的工厂模式中
会有如下的语句
比如一个接口IContent
IContent i=DALFactory.content.create();
看似返回的是一个sqlserverdal中的content对象,但是复制给了一个接口
貌似接口实例化了,其实不然
找了一下午找到java的解释
一样的吧:
一个论坛中发现的,记下了
那并不是创造接口的实例,接口是不能直接实例化的,就像你说的,得经过实现后才行。
而你列举的java.util.Enumeration arg_names = request.getParameterNames();这个并不是直接实例化,request.getParameterNames();返回的是Enumeration接口被实现后的对象,那是一个向上塑形的过程。可以这么看,实现接口的类可以看作是该接口的子类(这是java实现多重继承的解决方法)。所以那么写是合法的。好比有父类A,B是其子类,那么我们就可以这么写 A a=new B();这里的A就相当于Enumeration ,而new B()就相当于request.getParameterNames();返回的对象。你可以参看下面这个例子:
interface Face{
String prt();
}
class FaceImpl implements Face{
public String prt(){
return "implements Face";
}
}
class Middle{
public static Face getFace(){
return new FaceImpl();
}
class Last{
public Last(){
//下面这句就相当于你的 java.util.Enumeration arg_names = request.getParameterNames();
Face f = Middle.getFace();
f.prt();
}
}
会有如下的语句
比如一个接口IContent
IContent i=DALFactory.content.create();
看似返回的是一个sqlserverdal中的content对象,但是复制给了一个接口
貌似接口实例化了,其实不然
找了一下午找到java的解释
一样的吧:
一个论坛中发现的,记下了
那并不是创造接口的实例,接口是不能直接实例化的,就像你说的,得经过实现后才行。
而你列举的java.util.Enumeration arg_names = request.getParameterNames();这个并不是直接实例化,request.getParameterNames();返回的是Enumeration接口被实现后的对象,那是一个向上塑形的过程。可以这么看,实现接口的类可以看作是该接口的子类(这是java实现多重继承的解决方法)。所以那么写是合法的。好比有父类A,B是其子类,那么我们就可以这么写 A a=new B();这里的A就相当于Enumeration ,而new B()就相当于request.getParameterNames();返回的对象。你可以参看下面这个例子:
interface Face{
String prt();
}
class FaceImpl implements Face{
public String prt(){
return "implements Face";
}
}
class Middle{
public static Face getFace(){
return new FaceImpl();
}
class Last{
public Last(){
//下面这句就相当于你的 java.util.Enumeration arg_names = request.getParameterNames();
Face f = Middle.getFace();
f.prt();
}
}