インスタンス変数を使用してインターフェイス変数をシャドーイングするときに問題があります。私はメソッドをオーバーライドし、メソッド内で変数を手動で割り当てることでこれを行う方法を知っていますが、メソッドを呼び出すオブジェクトのインスタンス化された変数を使用する方法を理解することはできません。インスタンス変数を使用してインターフェイス変数をシャドーする方法
public interface ShakesHands {
static final String name = "Gabe";
public void shakeHands (ShakesHands other);
}
class Student implements ShakesHands{
String name;
@Override
public void shakeHands(ShakesHands other) {
String othersName = other.name;
System.out.println(name + " shook " + othersName + "'s hand.");
}
}
class Parent implements ShakesHands{
String name;
@Override
public void shakeHands(ShakesHands other) {
String othersName = other.name;
System.out.println(name + " shook " + othersName + "'s hand.");
}
}
public class App {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "Bob";
Parent parent1 = new Parent();
parent1.name = "Sally";
student1.shakeHands(parent1);
}
}
このコードは "Bob shook Gabe's hand"を出力します。インターフェース名 "Gabe"を参照するのをやめて、インスタンス名 "Sally"を参照して "BobがSallyの手を振った"ようにする方法はありますか?スタイルとクリーンなコードをコーディングに関する質問をともかく
なぜ、 'ShakesHands'は最初に' name'を持っていますか? –
フィールドに直接アクセスするのではなく、アクセサー(セッターとゲッター)を使用します。あなたの例はかなり疑わしいです。私はこのコーディングスタイルの有効な使用について考えることはできません。 – markspace
ShakesHandsに名前を割り当てないと、 "名前を解決できないか、フィールドではありません"というエラーが発生します。 –