论坛首页 Java版 OO

对应implements是不是应该有个关键字from

浏览 3078 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-04-11
楼主看一下Guice的那个ImplementedBy吧,我觉得这么写都是把接口本身存在的意义抹杀了
   
0 请登录后投票
最后更新时间:2008-04-11
先有interface,然后写个class来实现它,这个是目前interface的用处.
我现在说的是先有class,然后在不同的情况下抽取不同的interface,要搞清楚先后顺序,不要提什么什么模式可以达到我的需求,我没说目前的java语言不能实现,这只是我想的一个更方便直观的解决方法,希望回帖的人认真看完帖子,鸡同鸭讲很累.
   
0 请登录后投票
最后更新时间:2008-04-12
确实在某些需要Facade的场合有用,用代理是太麻烦了么,这个类型跟Interface功能类似,只是依赖关系正好相反,不过最好另起一个关键字,我想象这样写比较好
facade A narrow B

现在的java要改起来还涉及几个地方,新的转型逻辑,instance of,还有与interface相对的一些判断,不一定很简单
   
0 请登录后投票
最后更新时间:2008-04-12
逆向思维,不错不错 :)

我的理解
楼主的意思应该是一个bridge模式吧。。
这样无需在语言的层级去实现吧?
   
0 请登录后投票
最后更新时间:2008-04-12
不是不明白你的意思,只是你的需求作用有限。意义不大
   
0 请登录后投票
最后更新时间:2008-04-12
lmj 写道
确实在某些需要Facade的场合有用,用代理是太麻烦了么,这个类型跟Interface功能类似,只是依赖关系正好相反,不过最好另起一个关键字,我想象这样写比较好
facade A narrow B

现在的java要改起来还涉及几个地方,新的转型逻辑,instance of,还有与interface相对的一些判断,不一定很简单


我想在编译器这一层就可以解决,并且很简单
interface I from C
编译的时候把C的信息从I里面去掉,然后编译C的时候带上implements I就可以了

不过如果C是已经编译好的class,这样还是不行估计得在jvm做处理
1.在I里面保留C的引用,instanceof很简单可以实现可以参考目前的instanceof,但是这个interface就依赖于C了
2.在I里面去掉C的引用,instanceof可以在运行时判断I里面所有方法的签名是不是在C里面都有,I就跟原来的interface没什么两样,但是这个效率应该要低一点.

还有一个大的问题是要选一个关键字要向后兼容,enum在1.5之前不是关键字,在1.5之后用enum命名就会出错,from也是一个常用的命名词.
   
0 请登录后投票
最后更新时间:2008-04-14
楼主的需求其实还是没有描述清楚。我猜测你想要的是更细粒度的访问控制。因为java默认只有public/private/protected/default的区分,但是楼主似乎希望能自己定义一个访问权限,确保某个调用者(比如dwr)只能访问某些方法。

比如:

class A {
  public dwr x();
  private dwr y();
  public z();
}

dwr能访问 x(), y() 而不能访问 z()

这个需求用interface来描述其实不恰当,因为按照楼主的说法,你丧失了接口作为一个独立类型的意义,而且变成“接口”依赖“具体实现类”,所以有很多人来反对楼主。如果是像我描述的,楼主需要寻找一种细粒度的访问控制,则就不会有人来反对楼主了,呵呵。
   
0 请登录后投票
最后更新时间:2008-04-14
hax 写道
楼主的需求其实还是没有描述清楚。我猜测你想要的是更细粒度的访问控制。因为java默认只有public/private/protected/default的区分,但是楼主似乎希望能自己定义一个访问权限,确保某个调用者(比如dwr)只能访问某些方法。

比如:

class A {
  public dwr x();
  private dwr y();
  public z();
}

dwr能访问 x(), y() 而不能访问 z()

这个需求用interface来描述其实不恰当,因为按照楼主的说法,你丧失了接口作为一个独立类型的意义,而且变成“接口”依赖“具体实现类”,所以有很多人来反对楼主。如果是像我描述的,楼主需要寻找一种细粒度的访问控制,则就不会有人来反对楼主了,呵呵。

你的理解正确,但是按你的方法去加dwr等等是不可取的,首先关键字数量不定,其次这需要dwr自己去处理,我说的那种是通用的.
我前面说了,这个interface跟原来的interface不一样,但是也有一些相通的地方,所以借interface壳上市
   
0 请登录后投票
最后更新时间:2008-04-14
大家就是对“借壳上市”不满嘛,做好主营业务行不行……嘿嘿。

BTW,你也不要急着否定我说的方法。事实上这种方式是可行的,JavaScript 2的namespace机制就是这样的。

dwr可以不是关键字,而是一种特殊对象,叫做Namespace。我给个大体的例子:

package pkg1 {
  namespace dwr = new Namespace('http://getahead.org/dwr');
  namespace v2;

  public class MyClass {
    ...
    public a():int {...}
    v2 dwr a():String {...}
    private dwr b():void {...}
    dwr c():int {...}
  }
}

package test {
  import pkg1.*;

  var x:MyClass = new MyClass();
  var result1:int = x.a(); // call public a()

  namespace dwr = new Namespace('http://getahead.org/dwr');
  var result2:String = x.dwr::a(); // call v2 dwr a()

  use namespace pkg1.v2;
  x.a(); // call v2 dwr a()

  x.b(); // error!

  use namespace dwr;
  x.b(); // call private dwr b()
}


public/private等在JS2中不过是预先生成的namespace,与自定义namespace并没有本质差别。

当然在Java中,可能无法直接用JS2的语法。但是可以用annotation达到类似的效果。而且annotation是一种比namespace具有更丰富语义的构造。比如DWR自己的annotations:
@RemoteProxy
public class RemoteFunctions {
    @RemoteMethod
    public int calculateFoo() {
       return 42;
    }
}
   
0 请登录后投票
最后更新时间:2008-04-14
hax 写道
大家就是对“借壳上市”不满嘛,做好主营业务行不行……嘿嘿。

BTW,你也不要急着否定我说的方法。事实上这种方式是可行的,JavaScript 2的namespace机制就是这样的。

dwr可以不是关键字,而是一种特殊对象,叫做Namespace。我给个大体的例子:

package pkg1 {
  namespace dwr = new Namespace('http://getahead.org/dwr');
  namespace v2;

  public class MyClass {
    ...
    public a():int {...}
    v2 dwr a():String {...}
    private dwr b():void {...}
    dwr c():int {...}
  }
}

package test {
  import pkg1.*;

  var x:MyClass = new MyClass();
  var result1:int = x.a(); // call public a()

  namespace dwr = new Namespace('http://getahead.org/dwr');
  var result2:String = x.dwr::a(); // call v2 dwr a()

  use namespace pkg1.v2;
  x.a(); // call v2 dwr a()

  x.b(); // error!

  use namespace dwr;
  x.b(); // call private dwr b()
}


public/private等在JS2中不过是预先生成的namespace,与自定义namespace并没有本质差别。

当然在Java中,可能无法直接用JS2的语法。但是可以用annotation达到类似的效果。而且annotation是一种比namespace具有更丰富语义的构造。比如DWR自己的annotations:
@RemoteProxy
public class RemoteFunctions {
    @RemoteMethod
    public int calculateFoo() {
       return 42;
    }
}

js怎么变得这么丑陋,搞得太复杂了
Annotation我前面批过了,还是要每个框架自己去搞一套,命名如果觉得interface不爽,Annotation用@interface,这个可以用&interface,其实这个跟原来的interface没什么很大的区别还是interface更直观.
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐