欢迎光临
我们一直在努力

解决了一直困惑我的接口问题-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

前几天再写asp.net 的三层结构,数据库要求跨平台,用到反射技术来动态生成数据库类对象,用接口使方法统一.
问题就在这个接口上:
我在csdn .net论坛上发帖的内容为:
地址为:http://community.csdn.net/expert/topic/5103/5103400.xml?temp=.284115
//解决方案一:

//interf.cs   在项目interf中
namespace interf
{
    public interface i_interf
    {
        string f();
    }
}

 

//a.cs  在项目a中
using interf
namespace a
{
    public class a_class:i_interf      //继承 interf 接口
    {
        public string f()              //实现 interf 中的 f()
        {
           return “aaaaaaa”;
        }
    }
}

 

//b.cs  在项目b中
using interf
namespace b
{
    public class b_class:i_interf     //继承 interf 接口
    {
        public string f()             //实现 interf 中的 f()
        {
           return “bbbbbbb”;
        }
    }
}

//factory.cs 在项目factory中
namespace fac
{
    public class fac_class
    {
       public i_interf fac_function
       {
          string assumellyname = configurationmanager.appsettings[“assumelyname”];
          string constructorname = configurationmanager.appsettings[“constructorname”];
          return (i_interf)assembly.load(assumellyname).createinstance(constructorname);
       }
    }
}

//web.config 
    <add key=”assumelyname” value=”a”/>
    <add key=”constructorname” value=”a.a_class”/>

//test.cs  在项目bll中
using fac;
using interf;

namespace bll
{
    public class bll_class
    {
        public string bll_funtcion()
        {
           return (new fac_class()).fac_function().f();
        }
    }
}

 

——————————————————————————-
//解决方案二:

//a.cs  在项目a中
namespace a
{
    public class a_class  
    {
        public string f()    
        {
           return “aaaaaaa”;
        }
    }
}

//b.cs  在项目b中
namespace b
{
    public class b_class
    {
        public string f()      
        {
           return “bbbbbbb”;
        }
    }
}

//factory.cs 在项目factory中
namespace fac
{
    public class fac_class
    {
       public object fac_function
       {
          string assumellyname = configurationmanager.appsettings[“assumelyname”];
          string constructorname = configurationmanager.appsettings[“constructorname”];
          return assembly.load(assumellyname).createinstance(constructorname);
       }
    }
}

//web.config 
    <add key=”assumelyname” value=”a”/>
    <add key=”constructorname” value=”a.a_class”/>

//test.cs  在项目bll中

using fac;
using a;
using b;
namespace bll
{
    public class bll_class
    {
        public string bll_funtcion()
        {
           return (new fac_class()).fac_function().f();
        }
    }
}

问题一:  解决方案一
在factory.cs中制造了a的对象已接口interf的方式返回,在 bll中调用的是
interf.cs中的f(),虽然a.cs和b.cs都继承了interf的接口,为什么调用interf.cs中的f()
就能得到  “aaaaaaa”  应该是调用a中的f()才能得到的呀

问题二:    解决方案二
没有使用接口,a中有个f(),b中也有个f() 分别再两个命名空间中(a,b)
制造一个a的对象:(new fac_class()).fac_function()
调用a中的方法:(new fac_class()).fac_function().f()  会出错
a中的f(),b中的f() 不是再两个命名空间中的吗,为什么会出错

下面是 aafshzj(上海北京) ( 五级(中级)) 信誉:100    blog            的回答:
呵呵,这么多问题才20分?

问题一:问题在于你创建的是a的实例啊,a的实例被通过interf引用调用f方法得到  “aaaaaaa”不是很正常吗?你认为应该得到什么?、

问题二:出错很正常啊,原因不在于a和b的共存而在于(new fac_class()).fac_function()创建的是一个object,而object根本没有f这个方法。

interf只是接口,可以被看作纯abstract类型。它的所有方法相当于默认加了abstract/virtual修饰符的,实现接口的类型的接口方法相当于默认加了override方法的。这意味着什么呢?意味着interf引用的实例在执行借口方法时,将执行其实现类型的方法。这也很自然,因为接口方法都是没实现的空方法(不是方法体为空,是方法本身实际上就相当于空指针),也只有实现其具体实例的实际类型方法才合适。

实际上所有类型实例,无论其以什么基类型被引用,其实际执行的基类方法都是override层层覆盖中最后覆盖的一个,也就是实际实例的方法(不考虑new 修饰符中断override覆盖的情况)。

终于把问题给搞清楚了,很感谢aafshzj(上海北京) 的回答

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 解决了一直困惑我的接口问题-.NET教程,Asp.Net开发
分享到: 更多 (0)