发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

static方法在继承中如何使用?

2004-10-13 14:32
赞助商链接

我有这样一些类
父类:
public abstract class Base {
public static Base T(String param){
?????
ret.f(param);
return ret;
}
public abstract void f(String param);
}

子类:
public class AAA extends Base{
private String data;
public void f(String param) {
data="AAA's"+param;
}
}
子类:
public class CCC extends Base {
private String data;
public void f(String param) {
data="CCC's"+param;
}
}

调用:
public class Test {
public static void main(String[] args) {
AAA a = (AAA) AAA.T("orange");
CCC c = (CCC) CCC.T("apple");
}
}

我现在想问的问题是
1. AAA.T()和CCC.T()是从Base继承过来的,这样用是否符合常理?
2. 在Base.T()中能不能得知是通过哪个类调用过来的,并通过该信息创建该子类的实例,调用子类覆盖的方法f(),最后返回该子类?

2004-10-18 15:38

1.可以用。不符合常理。
2.不能得知是通过哪个类调用过来

其实你可以将Base.T()方法独立出来,使用工厂模式实现你的目的。

2004-10-20 14:24

多谢banq指点

2004-12-31 22:59

1.首先使用static修饰,则表示方法与类实例无关,请仔细考量是否必要!

2."在Base.T()中能不能得知是通过哪个类调用过来的"这种事情在oo中应该尽量不出现,这里可以使用Templet method来处理.或者参考banq所说使用工厂来做!感觉你的这个结构比较别扭,如果是项目中使用的代码,最好重构一下!^+^

Templet method的参考代码如下:
public abstract class Base{
public Base xxx(){
Base b = this.getX();
b.f(param);
return b;
}

public abstract f(String param);

public abstract Base getX();
}

public class AAA extends Base{
public f(String param){

}

public Base getX(){
AAA a;
...;
return a;
}
}

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com