Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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_Interface - Fatal编程技术网

Java 接口的部分实现

Java 接口的部分实现,java,oop,interface,Java,Oop,Interface,我有一个不确定的说法 public interface myInterfacy { String kilogramToGram(); Long litresTomiliLitres(); String inchesToMillimeters(); String ouncesToGrams(); } 我需要这个接口的多个实现,但我想在不同的实现上部分实现这个接口, 作为: 我认为我可以通过使用抽象类来进行di,但我想知道是否还有其他好的方法是可能的。答案

我有一个不确定的说法

public interface myInterfacy {

    String kilogramToGram();

    Long litresTomiliLitres();

    String inchesToMillimeters();

    String ouncesToGrams();

}
我需要这个接口的多个实现,但我想在不同的实现上部分实现这个接口, 作为:


我认为我可以通过使用抽象类来进行di,但我想知道是否还有其他好的方法是可能的。

答案相对简单,但有很多选择

你可以

  • 制作一些部分接口,并且“完成所有”的接口实现所有接口(不是很好)
  • 您可以创建一些“虚拟”接口,这些接口会引发未实现功能的异常。因此,每个代理类都将实现完整接口,但会在不受支持的方法上抛出运行时错误(也不是很好)
  • 只是什么都不做——照字面意思。实现完整的接口并提供空的实体(也不是很好)
或者,您可以使用特定的代理来封装功能,以提供给定的功能。例如

class FullyFunctional {
    public void foo() {...}
    public void bar() {...}
}

class PartiallyFunctional {
    FullyFunctional ff; 

    public PartiallyFunctional(FullyFunctional ff) {
        this.ff = ff;
    }

    // No foo...
    public void bar() { ff.bar(); }
}

一种方法是使用方便的基类。然而,这并不是一个好主意,因为您不会得到编译类型检查来帮助确保您不会调用未实现的方法

public interface Converter {
    public String kilogramToGram();
    public long litresTomiliLitres();
    public String inchesToMillimeters();
    public String ouncesToGrams();
}
public abstract class AbstractConverter implements Converter {
    @Override
    public String kilogramToGram() {
        throw new UnsupportedOperationException();
    }
    @Override
    public long litresTomiliLitres() {
        throw new UnsupportedOperationException();
    }
    @Override
    public String inchesToMillimeters() {
        throw new UnsupportedOperationException();
    }
    @Override
    public String ouncesToGrams() {
        throw new UnsupportedOperationException();
    }
}
public final class A extends AbstractConverter {
    @Override
    public String kilogramToGram() {
        //code
    }
}
跟随

  • 将脂肪界面划分为颗粒状小界面
  • 实现只需要接口
  • 一个极端情况:我将为四个方法声明四个接口

    public interface IKGToGram {
    
        String kilogramToGram();
    }
    public interface ILitersToMilliLeters{
    
        Long litresTomiliLitres();
    }
    public interface IInchesToMilliMeters{
    
        String inchesToMillimeters();
    }
    public interface IOunceToGrams{
        String ouncesToGrams();
    
    }
    
    现在,您可以实现任何想要实现的接口集

    查看有关接口隔离概念的说明:


    您必须实现界面中的所有方法,除非它们是具有默认实现的方法。如果您想拥有抽象类,那么您可以像您所说的那样提供一个默认实现。如果类
    a
    B
    应该是可实例化的,那么如果只实现了1个方法,为什么还要有4个方法的接口?使用组合来为实现者提供
    class a
    (在其构造函数中或以其他方式)对于您不希望在类A本身中实现的方法,请重新研究ISR原则和对OP问题的适用性。类不应或多或少实现。这比使用带组合或继承的适配器要好。
    public interface IKGToGram {
    
        String kilogramToGram();
    }
    public interface ILitersToMilliLeters{
    
        Long litresTomiliLitres();
    }
    public interface IInchesToMilliMeters{
    
        String inchesToMillimeters();
    }
    public interface IOunceToGrams{
        String ouncesToGrams();
    
    }