DALFactory.DataAccess 中的
        public static PetShop.IDAL.ICategory CreateCategory() {
            string className = path + ".Category";
            return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
        }方法定义成接口类型是什么作用?

解决方案 »

  1.   

    用此工厂模式作用就是通过物理静态实例化数据访问层的类
    从而可以实现完全分离业务层和数据访问层的依赖关系
    所以要用接口定义数据访问曾中的成员
    改变数据访问层时直接替换数据访问类库dll就可以更换系统数据库种类了
    因为接口不需要实现方法体实现多态性
    用接口就可以接受不同操作内容的类
    灵活
      

  2.   

    比如说你的项目中同时支持多种数据库,对于业务层以上的用户来说,是透明的,只要知道web.config中配置的是什么数据库就行了,他不需要了解具体的数据库操作细节
      

  3.   

     大家说的都好像是反射或接口的好处,
    我想知道“interfaceName className”这种形式是为了什么,为什么不用className:interfaceName,不明白其原因
     public static PetShop.IDAL.ICategory CreateCategory() { 
                string className = path + ".Category"; 
                return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className); 
            } 
      

  4.   

    PetShop4.0采用了多层应用程序体系结构,并且应用了反射注入技术,简间抽象工厂模式,策略模式和外观模式,从而构建了一个高内聚,低耦合的,易于扩展和维护的,适合于团队开发的小型企业分布式应用系统。
      

  5.   

    PetShop4.0采用了多层应用程序体系结构,并且应用了反射注入技术,简间抽象工厂模式,策略模式和外观模式,从而构建了一个高内聚,低耦合的,易于扩展和维护的,适合于团队开发的小型企业分布式应用系统。
    参考
    http://www.cnblogs.com/smhy8187/articles/859275.html
      

  6.   

    老大我不是要问petshop4怎么怎么,而是要问我想知道“interfaceName className”这种形式是为了什么,为什么不用className:interfaceName,不明白其原因 
    public static PetShop.IDAL.ICategory CreateCategory() { 
                string className = path + ".Category"; 
                return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className); 
            } 
    请就针对这种形式讲!谢谢!
      

  7.   

    你这个方法里没有这种格式:interfaceName className呀,你给的是个静态方法吧
      

  8.   

    没有什么理论上的道理。你自己完全可以声明一个class然后,让一个方法返回这个类型的对象。这个方法完全重构而返回这个类型的子类。你贴出的代码为什么返回ICategory?很大程度上因为人家就是设计了ICategory类,所以就用它了。其实完全可以返回任意的class或者interface。如果你不是那么执着于这里为什么必须返回这个interface,那么我们讨论为什么会需要interface。c#(以及java)是在语法上完全不支持多重继承的。对于支持多重继承的语言,例如一个“智能手机”既是一个通讯工具、也是一个mp4、还是一个电脑,那么我们可以写代码:public class 智能手机: 通讯工具,mp4,电脑
    {
         .......  //智能手机自己的扩展代码
    }那么,你在一个智能手机管理系统中如果要对所有手机检测cpu那么你的那个方法只要用“电脑”作为参数类型就可以了。
    然而,在.net系统大多数“官方”语言以及java中,不支持多重继承,你就不得不写为:public class 智能手机: 通讯工具,Imp4,I电脑
    {
         .......  //智能手机自己的扩展代码      这里必须重复实现一堆Imp4的接口属性和方法
          这里必须重复实现一堆Imp4的接口属性和方法
          这里必须重复实现一堆Imp4的接口属性和方法
          这里必须重复实现一堆Imp4的接口属性和方法
          这里必须重复实现一堆Imp4的接口属性和方法
          ............      这里必须重复实现一堆I电脑的接口属性和方法
          这里必须重复实现一堆I电脑的接口属性和方法
          这里必须重复实现一堆I电脑的接口属性和方法
          这里必须重复实现一堆I电脑的接口属性和方法
          这里必须重复实现一堆I电脑的接口属性和方法
          ............
    }
    实际上许多class因为我们已经让它从一个class继承了,我们要让它从其它class继承已经不可能,只能造出interface来这样使用。这样,你在一个智能手机管理系统中如果要对所有手机检测cpu那么你的那个方法只要用“I电脑”作为参数类型。
    这是不得已,我们去写Imp4和I电脑。interface的双刃剑问题就出来了,有人认为这提供高了class灵活性,有人认为这降低了class的灵活性。
      

  9.   


    interface中不能声明有静态方法,但是静态方法完全可以返回一个interface类型的对象的。
      

  10.   

    可LZ这个方法就是声明在类里的呀?<PetShop.DALFactory.DataAccess>
    LZ问的是这个方法的声明还是签名?还是其它地方的事..
      

  11.   

    我再问一下:引用petshop4中的结构namespace PetShop.IDAL { /// <summary>
    /// Interface to the Item DAL
    /// </summary>
    public interface ICategory{        定义的方法略
            }
    }namespace PetShop.SQLServerDAL {    public class Category : ICategory {    内容略
        }namespace PetShop.DALFactory {public sealed class DataAccess {
    public static PetShop.IDAL.ICategory CreateCategory() { 
                string className = path + ".Category"; 
                return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className); 
            } 
    }
    }其中是不是因为Category是ICategory的实现类,所以反射要返回的类型就是ICategory呢,如果不返回ICategory类型会怎么样呢?
      

  12.   

    应该说,在系统设计的时候就确定了的,DALFactory工厂就是用来制造ICategory实体类的实例的;LZ却反过来问为什么要返回ICategory实例.
    ...如果不返回怎么样,估计,谁也没有办法(不会你想做些漏洞?)所以
    (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className); 
    语句中就是用了强制类型转换
      

  13.   

    例如著名的的OO语言Eiffel就没有interface,它号称编译出来的代码的运行速度可比c++,而它的面向对象风格严谨和智能得“无需其它辅助case工具,它的代码就是最好的设计文档”。只是,java、.net这种大众化在创建时就是不支持多重继承的,如果要支持则要动其根本(就好像微软技术从COM时代进入.NET时代的变化的状况几乎一样),因此大多数程序员以为interface是天经地义的,连我也经常说“要学会使用接口进行设计”。我们使用这样的工具,就不得不为这样的工具说话,强奸变成了习惯说不定也能成为一家人。虽然我考虑面向对象设计时是可以避免去考虑“是interface还是class”,但是实现时我们不得不考虑。除非我们使用那些一些不太流行的(但是绝非不好用)的支持多重继承的OO语言,那么“类型”就是干干净净的类型,没有什么class与interface之分,就可以把这种争论彻底消除了。
      

  14.   


    嗯,只能从旁(从无需interface的OO语言如何实现这个功能)来对比地回答。结果我却发现,这实际上是在说interface的坏话。