【问题标题】:Java method overriding without casting inside覆盖Java方法而不进行内部转换
【发布时间】:2013-11-15 16:12:18
【问题描述】:

我有一个 BasicFooBuilder 类,它有一个 buildFoo 方法接收一个 Foo 并构建一些东西。但是我想创建一个完整的构建器层次结构和我想要使用的更复杂的对象。目前我有这样的事情:

public interface Builder{
 public void buildFoo(BasicFoo foo);
}

public class BasicFooBuilder implements Builder{
 @override
 public void buildFoo(BasicFoo foo){
  //Do something
 }
}

public class FancyFooBuilder extends BasicFooBuilder{
 @override
 public void buildFoo(BasicFoo foo){
  ((FancyFoo)foo).doSomethingFancy();
 }
 //More stuff inherited from basic foo
}

public class FancierFooBuilder extends FancyFooBuilder{
 @override
 public void buildFoo(BasicFoo foo){
  ((FancierFoo)foo).doSomethingFancier();
 }
 //More stuff inherited from basic foo and fancy foo
}

类层次结构是这样的:

BasicFoo
  |
  FancyFoo
    |
    FancierFoo

所以问题是这样的:

如果不在子类的覆盖方法中进行所有强制转换,我该如何进行上述操作?

【问题讨论】:

    标签: java inheritance interface overriding subclass


    【解决方案1】:

    您将需要一个泛型类型参数,它基本上代表您正在构建的类本身。你不能把它限制在只有一个类,但你可以接近。

    public interface Builder<T extends BasicFoo> {
     public void buildFoo(T foo);
    }
    
    public class BasicFooBuilder<T extends BasicFoo> implements Builder<T> {
     @Override
     public void buildFoo(BasicFoo foo){
      //Do something
     }
    }
    
    public class FancyFooBuilder<T extends FancyFoo> extends BasicFooBuilder<T> {
     @Override
     public void buildFoo(T foo){
      foo.doSomethingFancy();
     }
     //More stuff inherited from basic foo
    }
    
    public class FancierFooBuilder<T extends FancierFoo> extends FancyFooBuilder<T> {
     @Override
     public void buildFoo(T foo){
      foo.doSomethingFancier();
     }
     //More stuff inherited from basic foo and fancy foo
    }
    

    【讨论】:

    • 完美。这正是我一直在寻找的。除了“编程的好方法”之外,这种模式还有名称吗? :)
    • 我不知道这个“模式”是否有名字。它只是使用泛型来定义类之间的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多