我依照petshop这样写了一个工程.但我发现在反射生成实例时.得到的类实例只能访问接口里定义的方法.而不能访问接口里没有的方法.这我就奇怪了.那不是要把接口和具体实现类的方法写成一对一的关系.这种方法好像是为了强制实现类必须实现. 不知道是不是这样.但感觉这样好麻烦???? 一定要写成一对一关系.

解决方案 »

  1.   

    得到的类实例只能访问接口里定义的方法.而不能访问接口里没有的方法.
    -------------------------------------------------------------------
    这个是当然的,要不然干吗要接口呢?难道只是摆设?这我就奇怪了.那不是要把接口和具体实现类的方法写成一对一的关系.
    -------------------------------------------------------------
    说实话我也很奇怪,为什么petshop要用反射来实例化呢,为啥不用new 呢?好好看看书,看看工厂方法是为了解决什么问题。然后再来问这个问题。
    模式虽好,但也不能乱用
      

  2.   

    我不看petshop这种浪费时间的例子。不过我估计着大概给你举例回答一下:我们假设有以下领域设计:class 鸭嘴兽:哺乳动物,I禽类
    {
      .....
      public bool 是否怀孕;
      public int I禽类.是否会飞;
    }class 人工繁殖鸭嘴兽:鸭嘴兽,I动物园里的动物
    {
      public Image I动物园里的动物.图片;
      public void I动物园里的动物.捐款()
      {
         ......
      }
    }关系数据库表可能是这样设计的:  饲养动物(饲养员姓名,动物编号)
      动物(动物编号,真正类型)
      鸭嘴兽(动物编号,是否怀孕,是否能飞)
      人工繁殖鸭嘴兽(动物编号,图片)而程序的业务逻辑大致是:给出动物编号,然后再屏幕上显示这个动物的具体信息例如图片等,用户可以在网页上捐款。此时,程序首先根据动物编号找出真正的具体类型——人工繁殖鸭嘴兽,然后实例化它,然后返回的着一只人工饲养鸭嘴兽被赋值给网页定义的“I动物园里的动物”类型的变量,用于处理捐款。
      

  3.   

    显然,网页上就是针对“I动物园里的动物”类型的对象进行处理的。不论传给它的对象是什么类型,只要具有I动物园里的动物接口就可以了。页面并不处理“否怀孕,是否能飞”等特性,不知道也不过问,尽管传给它的对象可能(也可能)具有这些属性或方法,页面并不关心。因为业务的多态处理仅需要涉及“I动物园里的动物”接口类型。你说这里的“I动物园里的动物”跟“人工繁殖的鸭嘴兽”、“鸭嘴兽”、“哺乳动物”、“动物”有什么“麻烦的”意义对应关系呢?这中抽象、多态能力是很方便的。有些人很难理解不同类型的继承、接口的“is a”概念,只能理解对象之间“has a”的聚合关系,不能理解抽象的作用只能理解最直观的实体存在,那么所理解的系统设计就不是面向对象的,顶多是“基于对象”的,缺少几乎所有面向对象的好处。
      

  4.   

    尽管传给它的对象可能(也可能)具有  -->  尽管传给它的对象可能(也可能不)具有
    有什么“麻烦的”意义对应关系呢      -->  有什么“麻烦的”“一一对应关系”呢
      

  5.   

    “I动物园里的动物”其实跟其他概念没有什么关系,它们对象的某个实例也没有必然的联系。I动物园里的动物abc并不必然是鸭嘴兽abc,甚至也并不必然是动物abc,但是人工饲养鸭嘴兽xyz必然是鸭嘴兽xyz、动物xyz和I动物园里的动物xyz。这里的“是”是上面所说的“is a”关系。