如何在java中实现接口的类中添加受保护的方法?

时间:2012-06-22 12:24:25

标签: java interface wrapper

我有一个名为Property的类,除了get - 方法之外什么都没有。创建Property的新实例时,将设置所有字段。 Property实现了一个名为IProperty的接口。

由于我使用的库中存在一些错误,我必须在创建后重新设置Property实例的名称。因此,建议创建一个WrapperProperty类,该类将提供一个公共setName - 方法,该方法本身在setName()中调用因此创建的Property - 方法,该方法将受到保护/包视图。

问题在于我无法在Property中保护此方法,因为Eclipse告诉我将其添加到接口IProperty并将其公开。

有一些解决方法吗?

WrapperIProperty:

public class WrapperIProperty {

    private IProperty prop;

    WrapperIProperty(Property prop) {
        this.prop = prop;
    }

    public void setName(String name) {
        prop.setName(name);
    }
}

属性:

public class Property implements IProperty {

    String name;

    protected void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    public int getFoobar() {
        return 123;
    }
    public int getWhatever() {
        return 987;
    }
}

的iProperty:

public interface IProperty {

    public int getWhatever();
    public int getFoobar();
    public String getName();

}

这就是目前的情况。显然它不会起作用,因为我不能在Property类中保护该方法。因此,我最好以某种方式摆脱界面入口。但是如何?

4 个答案:

答案 0 :(得分:1)

您可能想要做的是单独留下IProperty界面(不要将setName方法添加到其中)并创建一个委托包装类,它提供您想要的方法(包装接口的实现。)

通过这种方式,您可以将包装的属性和常规属性提供给任何需要它们。

public class WrappedProperty implements IProperty {

    private String name;

    private Property prop;

    WrappedProperty (Property prop) {
        this.prop = prop;
    }

    protected void setName(String name) {
        this.name = name;
    }
    public int getWhatever() {
        return prop.getWhatever();
    }
    public int getFoobar() {
        return prop.getFoobar();
    }    
    public String getName() {
        if (this.name == null) {
           return prop.getName():
        } else {
            return this.name; 
        }
    }
}
public class Property implements IProperty {        

    public String getName() {
        return "blah";
    }
    public int getFoobar() {
        return 123;
    }
    public int getWhatever() {
        return 987;
    }
}
public interface IProperty {

    public int getWhatever();
    public int getFoobar();
    public String getName();

}

答案 1 :(得分:0)

Interface中的方法在范围上是公共的,因此实现类不能通过减少其可访问性来覆盖方法。让他们public

答案 2 :(得分:0)

您不能在接口中使用公共 methodName ,也不能在实现此接口的类中使用私有或受保护的 methodName

因此,您可以在类中公开 methodName

  • 此方法无效
  • 此方法调用 [another] methodNameProtected (您为新的受保护方法指定另一个名称)

<强>更新

如果只想在Interface中使用它,则必须在AbstractClass中更改接口并将其放入方法中   public final returnCode methodName 如果该方法对所有继承的类都是通用的

答案 3 :(得分:0)

找到解决该问题的方法:

WrapperIProperty:

public class WrapperIProperty {

    private Property prop;

    public WrapperIProperty(IProperty prop) {
        this.prop = (Property) prop;
    }

    public void setName(String name) {
        prop.setName(name);
    }

}

<强>属性:

public class Property implements IProperty {

    private String name = null;

    [...]

    void setName(String name) {
        this.name = name;
    }
}

<强>的iProperty:

public interface IProperty {

    [...]
}

这将完成工作