Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在特定对象中实现接口_Java_Oop - Fatal编程技术网

Java 在特定对象中实现接口

Java 在特定对象中实现接口,java,oop,Java,Oop,我正在尝试实现一个接口,它应该影响类的某些对象,但不会影响其他对象 例如,假设这是我的代码: public interface KnowsHowToSwim{ double getHowFast(); } public class Stable{ Horse pinky = new Horse(veryFast); Horse lightning = new Horse(veryPretty){ @Override public floa

我正在尝试实现一个接口,它应该影响类的某些对象,但不会影响其他对象

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

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
}
现在,我知道我可以创建一个新类来扩展horse并实现KnowHowToSwim,但是由于我的应用程序将有许多来自不同类的字段来实现该接口,我想知道是否有一种方法可以在特定对象中实现接口,就像Horse lightning重写其方法一样。

不,你不能

您不需要trait或mixin之类的东西,这在Java中是不受支持的。 Java8在接口中的默认方法不适用于您,因为您需要实例中的属性或对实例的访问,这是不可能的。默认方法没有对此的引用

此外,从面向对象的角度来看,您必须定义一个单独的类,扩展Horse并实现KnowsHowToSwim。所有的例子都是一匹马,知道如何游泳。当然,您只能创建它的一个实例

但是,您可以在方法体内部定义一个类,即工厂方法,也称为本地类。此类包含对方法中所有有效最终变量的引用。例如:

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();

}

但只要您没有从可访问的方法范围中获得任何好处,我就不推荐它。改为使用静态内部类,可选地使用有限可见性或包私有类。这将使您的代码更加内聚。

Java 8接口默认方法实现能否满足您的需要?让类stable实现您的接口,并在类stable中创建默认实现。现在,只有在需要时,才可以像在示例中那样重写该方法。@metichi您确定继承是唯一的方法吗?我不完全理解你的需要,但也许构图对你更合适。我担心会是这样。有没有可能在一个方法中定义新的类,这样我就可以在我实例化对象的地方声明它,并将其全部放在代码中?