免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2701 | 回复: 14
打印 上一主题 下一主题

return object请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-24 14:10 |只看该作者 |倒序浏览
以前看到一个实际返回类型为申明类型子类的例子,自己写了一个却存在问题,各位看官请指教

import java.util.*;
public class Ins1 {
        public static void main(String args[]){
                Cab cab =new Cab();
                Object o=cab.action1();
                o.bark();
               
            
        }

}

class Vegetable{
            void grow(){
            System.out.println("a vegetable growing!");
        }
}

class Dog{
        void bark(){
        System.out.println("a barking dog!");
        }
}

class Cab{
                   Object action2(){
           Vegetable veg=new Vegetable();
           return veg;
          }
                    
          Object action1(){
                  Dog dog= new Dog();
                  return dog;
                  }
                    
}

论坛徽章:
0
2 [报告]
发表于 2006-01-24 21:09 |只看该作者
Object o=cab.action1();
这个时候o还是Object,不能运行o.bark(),一定要强制转换

Dog o = (Dog)cab.action1();
然后才能
o.bark();

论坛徽章:
0
3 [报告]
发表于 2006-01-25 14:34 |只看该作者
斑竹厉害。嘿嘿
就像容器里的遍历方法:每一个对象都是Object的子类。但是取出来的时候这个Object 不一定就是某个具体的子类。编译器也无法做隐式转换。需要程序员的认为强制转换.

论坛徽章:
0
4 [报告]
发表于 2006-01-26 09:23 |只看该作者
or

Cab cab =new Cab();
Object o=cab.action1();
   ((Dog)o).bark();

论坛徽章:
0
5 [报告]
发表于 2006-01-27 14:04 |只看该作者
谢谢各位,只是,
强制转换得时候是否用instanceof更安全一些呢?对什么时候用instanceof还是不够明了
最后祝福大家新年快乐。

论坛徽章:
0
6 [报告]
发表于 2006-01-27 16:51 |只看该作者
看看这段代码,再运行一下,再好好思考一下。

  1. public class Ins1 {
  2.         public static void main(String args[]) {
  3.                 for(int i=0;i<10;i++)
  4.                 {
  5.                         runtest();
  6.                 }
  7.         }
  8.        
  9.         static void runtest()
  10.         {
  11.                 Cab cab = new Cab();
  12.                 Object o = cab.action();
  13.                 if( o instanceof Dog)
  14.                 {
  15.                         ((Dog)o).bark();
  16.                 }
  17.                 else
  18.                 {
  19.                         ((Vegetable)o).grow();
  20.                 }
  21.         }
  22. }

  23. class Vegetable {
  24.         void grow() {
  25.                 System.out.println("a vegetable growing!");
  26.         }
  27. }

  28. class Dog {
  29.         void bark() {
  30.                 System.out.println("a barking dog!");
  31.         }
  32. }

  33. class Cab {
  34.        
  35.         Object action() {
  36.                 if(Math.random() > 0.5)
  37.                 {
  38.                         return new Dog();
  39.                 }
  40.                 else
  41.                 {
  42.                         return new Vegetable();
  43.                 }
  44.         }
  45. }
复制代码


instanceof 是java比较原始的解决耦合的办法,现在有了新的方法,叫做依赖注入(Dependency Injection)现在很多Framework都使用了DI,最著名的就是SpringFramework。

[ 本帖最后由 perryhg 于 2006-1-27 16:56 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-01-27 20:49 |只看该作者
再思考一下这段代码,和上一段有什么区别


  1. public class Ins1 {
  2.         public static void main(String args[]) {
  3.                 for(int i=0;i<10;i++)
  4.                 {
  5.                         runtest1();
  6.                 }
  7.         }
  8.        
  9.         static void runtest1()
  10.         {
  11.                 Cab cab = new Cab();
  12.                 Doable o = cab.action();
  13.                 o.doit();
  14.         }
  15. }

  16. interface Doable {
  17.         public void doit();
  18. }

  19. class Vegetable implements Doable{
  20.         void grow() {
  21.                 System.out.println("a vegetable growing!");
  22.         }

  23.         public void doit() {
  24.                 grow();
  25.         }
  26. }

  27. class Dog implements Doable {
  28.         void bark() {
  29.                 System.out.println("a barking dog!");
  30.         }

  31.         public void doit() {
  32.                 bark();
  33.         }
  34. }

  35. class Cab {
  36.        
  37.         Doable action() {
  38.                 if(Math.random() > 0.5)
  39.                 {
  40.                         return new Dog();
  41.                 }
  42.                 else
  43.                 {
  44.                         return new Vegetable();
  45.                 }
  46.         }
  47. }
复制代码


通过Interface实现多态是java的一大亮点(尽管不是java独创),如果不用Interface,会发生什么情况呢?

我们假设:有服务器和客户机2台机器,如果现在只有Dog 和Vegetable两个类,那么可以这样
                if( o instanceof Dog)
                {
                        ((Dog)o).bark();
                }
                else
                {
                        ((Vegetable)o).grow();
                }
思考:如果要增加一个Cat类怎么办呢?
需要修改客户机和服务器两边的代码,两台机器都重新编译,然后才能运行。而且每次增加,服务器都要修改代码,这里就要不断得增加 if else... 尤其是服务器,修改代码,重编译以后还得停止程序重新运行,造成服务中断。如果你现在是服务器管理员,这个功能是给下面的销售代理用的,那么你下面如果发展了100个代理,每个代理都有自己独特的方法实现,那么你就等着加班改程序吧。

现在用了Interface,你只要把Interface文件下发给代理,只要客户端实现doit(),服务器就会自动识别并运行,服务器端无需修改代码,无需重编译,无需停机。你只要在服务器旁看着,喝喝茶就行了。

[ 本帖最后由 perryhg 于 2006-1-27 21:08 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-02-06 09:29 |只看该作者
新年好新年好 ,谢谢版主的细心回答,相信大家对DI也会有更深的了解。
但我一开始给出的例子中为什么
           Cab cab =new Cab();
                Object o=cab.action1();
                ((Dog)o).bark();

而不要用
if( o instanceof Dog)
     {
          ((Dog)o).bark();
      }

论坛徽章:
0
9 [报告]
发表于 2006-02-06 21:18 |只看该作者

  1.            Object action2(){
  2.            Vegetable veg=new Vegetable();
  3.            return veg;
  4.           }
  5.                     
  6.           Object action1(){
  7.                   Dog dog= new Dog();
  8.                   return dog;
  9.           }
复制代码

你当然可以用instance of,程序不会报错的,可是既然你的程序已经确定action1()返回Dog,那么再用instance of不是有点多此一举?

论坛徽章:
0
10 [报告]
发表于 2006-02-07 10:06 |只看该作者
请问版主使用interface的代码是否就是DI?
经常这么使用interface可是头一次听说DI的

另外楼主在多态这方面概念有些混淆,基本上说当你的对象被赋予了一个父类的引用的时候,这里为Object,编译器认为这是一个父类对象,所以编译器不认为这个对象有你想调用子类有而父类没有的方法,所以楼主贴的代码会报错,这时如果想使用子类对象的方法,就需要强制转换了。当然通过实现一个接口来解决这个问题要更好,可能就是DI吧,有待回答。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP