0

-methodsしか持たPropertyないというクラスがあります。の新しいインスタンスが作成さgetれると、すべてのフィールドが設定されます。と呼ばれるインターフェースを実装します。PropertyPropertyIProperty

使用しているライブラリにバグがあるため、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クラスでメソッドを保護することができないため、明らかに機能しません。したがって、どうにかしてinterfaceeエントリを削除するのが最善です。しかし、どのように?

4

4 に答える 4

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

}
于 2012-06-22T13:42:40.127 に答える
0

のメソッドはInterfaceスコープ内でパブリックであるため、クラスを実装しても、アクセシビリティを低下させてメソッドをオーバーライドすることはできません。それらを作りますpublic

于 2012-06-22T12:38:35.543 に答える
0

インターフェイスにpublic methodNameを持ち、このインターフェイスを実装する Class にprivate または protected methodNameを持つことはできません。

したがって、 Class でmethodNameを public にすることができます。

  • このメソッドは何もしません
  • このメソッドは[another]methodNameProtectedを呼び出します (新しい保護されたメソッドに別の名前を付けます)

アップデート

Interface でのみ必要な場合は、AbstractClass で Interface を変更し、メソッド public final returnCode methodNameを配置する必要があります (メソッドが継承されたすべてのクラスで共通の場合)。

于 2012-06-22T12:56:24.683 に答える
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;
    }
}

プロパティ:

public interface IProperty {

    [...]
}

これは仕事をします

于 2012-06-22T13:59:45.930 に答える