2012-04-24 13 views
1

拡張クラスの関数を呼び出したいと思います。これはどうすればできますか?拡張クラスの呼び出し関数

class Main{ 
    Function(); 
} 

class Other extends Main{ 
    public void Function() { /* The function code */ } 
} 
+4

あなたは 'super.Function()'、すなわち、スーパーのメソッドを呼び出すために、おそらく意味しますか?あなたの質問は非常に曖昧であり、重要な細部をたくさん残しています。私たちが推測する必要がないように物事を明確にすることはできますか? –

+0

あなたのコメントについては、 'あなたはそれとは逆の方法をしています。私は、メインクラスが他のクラスで書かれた関数を呼びたいと思っています。'いいえ、そうではありません。 **決して**子クラスに依存することはありません。コードでどのようにこの問題を解決しようとしているかを教えてください。解決しようとしている全体的な問題を教えてください。私は、継承が正しい解決策に関与していないと考えています。 –

答えて

0

あなたは抽象クラスとしてMainを定義し、Otherサブクラスで実装抽象メソッドとしてfunction()を定義することができます。ただし、ある時点でOtherのインスタンスを作成する必要があります。

+0

私は以下のインスタンスを使用しました: その他のインスタンス= newその他(); Other.Function() メインクラスに戻りました。それは機能を見つけることができないと言います。私はこのことがどういうふうに誤解していると思います。私はそれについてたくさんの読書をしました。あなたはこれを達成する方法についてもう少しフィードバックをお願いできますか? – user1042304

+0

完全なソースを提供できますか? Mainは 'Other'によって実装されているだけなので、' Other'Function()ではなく、メインクラスで 'Function()'を呼び出すべきでしょう。 –

0
class Main { 
    public void Function() { F2(); } 

    public abstract void F2(); 
} 

class Other extends Main { 
    public void F2() { /* code here */ } 
} 
+0

あなたはそれとは逆です。私はメインクラスが他のクラスで書かれた関数を呼び出すようにします。 – user1042304

+0

コメントに基づいて更新されました。 –

+0

@ user1042304:これは絶対にしないでください。元の質問への私のコメントを見てください。より良い助けを得るには、あなたが解決しようとしている全体的な問題を含めて、それをどのように解決しようとしているのかを含めて詳細を教えてください。 –

2
public class BaseCls { 
    void function() { 
     System.out.println("Base"); 
    } 
} 



public class ExtCls extends BaseCls { 
void function() { 
    super.function(); 
    System.out.println("ExtCls"); 
} 

public static void main(String args[]) { 
    new ExtCls().function(); 
    } 
} 
0

クラスMainは、クラスMainにないクラスOtherにあるものに関しては、特別な権限を持っていません。また、Mainオブジェクトは必ずしもOtherオブジェクトである必要はありません。したがって、クラスMainのオブジェクトがFunction()と呼び出されたときの動作を定義する必要があります。あなたはどちらか

  • あなたは抽象自体をFunction()を定義するかを強制されるクラスMainとクラスOtherのオブジェクトを作成することはできませんつまり、抽象的であることをFunction()を宣言することができ、または
  • は働くクラスMainでのデフォルトの実装を宣言しますMainsであり、Otherではないオブジェクトの場合。

いずれの場合も、状況によっては受け入れ可能です。あなたの状況に適しているものを選択するのに役立つ場合は、より詳細な情報を提供する必要があります。

例:

class Main { 
    public abstract void Function();  

    private void SomeFunction() { 
     Function(); 
    } 
} 

class Other extends Main { 
    public void Function() { /* code here */ } 

} 

または

class Main { 
    public void function() { /* default code here, can be empty */ };  

    public void someFunction() { 
     function(); 
    } 
} 

class Other extends Main { 
    public void function() { /* code here */ } 

} 

class Example { 
    public void example() { 
     Main main = new Main(); 
     Other other = new Other(); 

     main.function(); // call the function defined in class Main 
     other.function(); // call the function defined in class Other 

     main.someFunction(); // call Main.someFunction, which calls Main.function 
     other.someFunction(); // call Main.someFunction, which calls Other.function 
    } 
} 
+0

私はあなたの2番目のオプションが好きでしたが、Function()は拡張クラスによって変更されていません。 – user1042304

+0

@ user1042304、両方の方法で使用することはできません。拡張クラスで定義されている関数を呼び出すか、そうでない関数を呼び出すかのどちらかです。拡張クラスが関数を変更していない場合、どのような意味で「拡張クラスの関数」ですか? –

+0

拡張クラスで作成した関数を呼び出す必要があります。しかし、ここでの提案は、Function()をMainクラスで定義された空として表示し、次にExtended Classで再び定義することです。 – user1042304

関連する問題