在特定对象中实现接口

时间:2017-08-07 14:26:01

标签: java oop

我试图实现一个应该影响某个类的某些对象而不影响其他对象的接口。

例如,假设这是我的代码:

public interface KnowsHowToSwim{
    double getHowFast();
}

public class Stable{
    Horse pinky = new Horse(veryFast);
    Horse lightning = new Horse(veryPretty){
        @Override
        public float getPrettynessFactor(){
            return super.getPrettynessFactor()*10000000000
        }
    };
    Horse wetty = new Horse(soCool); <-- This one should KnowHowToSwim
}

现在,我知道我可以创建一个扩展马并实现KnowHowToSwim的新类,但由于我的应用程序将有很多来自不同类的字段来实现该接口,我想知道是否有办法实现特定对象中的接口,类似于Horse lightning如何覆盖其方法。

1 个答案:

答案 0 :(得分:1)

不,你不能。

你不喜欢特质或混合,这在Java中是不受支持的。 Java8在接口中的默认方法不适合您,因为您需要实例中的属性(或访问实例),这是不可能的。默认方法没有引用this

此外,从OO的角度来看,您必须定义一个单独的类,扩展Horse并实现KnowsHowToSwim。所有这些都是马和诀窍游泳。当然,你只能创建一个实例。

但是,您可以在方法体(即工厂方法),a.k.a。本地类中定义一个类。该类保留对方法中所有(实际上是最终的)变量的引用。例如:

public static Horse newSwimmingHorse() {

  final Object methodScopeProperty = ...;

  class SwimmingHorse extends Horse implements KnowsHowToSwim {
    double speed;
    double getHowFast(){
      methodScopeProperty.doSomething(); //do you need this access?
      return speed;
    }
  }

  return new SwimmingHorse();

}

但是,只要您不从可访问的方法范围中获得任何好处,我就不会推荐它。使用静态内部类,可选择使用有限的可见性或包私有类。这可以使您的代码更具凝聚力。