呵呵,我没有那么聪明,也不是想象力丰富,其实我我很不善于抽象思维,非要想点什么出来才行的。说到那个瞎子类,如果不算人的子类,那么应该算是什么呢?它和人类(称做人的那个类)之间是什么关系呢?我本来是这么想的:
class 人{
    public image look(){
        return 看到的图像;
    }
}
class 超人 extends 人 {
    public image look(){
        return 看到的图像;
    }
}
class 瞎子 extends 人 {
    public image look(){
        return  漆黑一片;
        (return null;)
    }
}这样的话,把瞎子作为人的子类行吗?

解决方案 »

  1.   

    是这样,如果从生物学出发,那么你那个瞎子当然属于人的子类.所以我说是合适的设计,不是对错的问题,而是你用在什么地方.
    子类不应该总是改写父类的方法,而是扩展.class 人{
        public image look(){
            return 看到的图像;
        }
    }class 超人 extends 人 {
        public void fly(){
            System.out.println("I can fly!");
        }
    }这样,超人不仅能look,还可以fly。超人是人的子类。你可以把超人当作人,因为你调用他的look方法,他会做出正确的动作。人 oneman = new 超人();
    oneman.look();这个时候,尽管你得到的是超人的实例,但是你仅仅关心他是个人,这种调用就是上溯造型
      

  2.   

    我觉得既然你要将瞎子作为人的子类,而瞎子又是不能看的,可以有这样的几种做法
    1、既然有些人是不能“看”的,那么“看”就不应该是基础类的方法,而是子类的方法,只用说有的“人”共有的方法和属性才可以在基础类"人"中
    interface 人
    {
       String 名字;
      ...
     其它一些任何一个“人”都具有的属性
      public 心脏跳动();
     其它一些任何一个“人”都具有的方法}class 正常人 impl 人
    {
      //正常人的属性;
      眼睛;
      嘴;
      //正常人的方法
      public  图像  看()
      {
         return 眼睛.看(); 
      };
      public  声音  听()
      {
          return 耳朵.听();
      };   }class 瞎子 impl 人
    {
     //瞎子的属性;
      眼睛;//瞎子还是有眼睛的,只是不能看而已。
      耳朵;
      //瞎子的方法 是没有听的方法的
      public  声音  听()
      {
          return 耳朵.听();
      };   
    }2、认为瞎子也是可以看的,看的只是NULL或者是SeeException;
    interface 人
    {
       眼睛;
       耳朵;
       public 图像 看();
       public 声音 听();}class 瞎子 impl 人
    {
       眼睛;
       耳朵;
       public 图像 看()
       {
        return NULL;
       //或者 throws SeeExcption;
       }
       public 声音 听();
    }3.只用“人”interface 和 “人”的实现
    interface 人
    {
       眼睛;
      耳朵; 
    ..
    看();
    听();}class 人impl impl 人
    {眼睛 a;
    耳朵 b;   
     //构造函数
        public 人impl(眼睛 a,耳朵 b, 嘴 c...)   {
         this.a=a;
         this.b=b;
       
      } 
      public 图像 看()
      {
       if(a==瞎子的眼睛)
         return NULL;
       ...
      };}