2011-08-10 13 views
1

呼び出されたマルチティアクラスのシステムで特定の関数が呼び出され、呼び出されたときに正しい関数が選択されます。特定のクラスの関数を選択するように指示するにはどうすればよいですか?正しい関数を呼び出す多態性

これが十分であるかあまりにも漠然としているかわからないので、私には正しい答えを得るために必要なその他の情報を教えてください。私が提供する必要があることを具体的に私に教えてください。私はC#も初めてです。

+0

は、複数のディスパッチのようですね。 –

+2

クラスA:クラスB:A {} '' C:B {} 'のような継承を継承し、instanceOfA.SomeMethod()を呼び出してC.SomeMethodを実行したいとしますか?その場合は、メソッドを仮想としてマークしたいと思うでしょう。正直なところ、質問は理解するのが難しいです。 – asawyer

+2

おそらく、質問にいくつかの詳細を追加できますか?それは '特定の関数'のコードを持つのに役立ちますし、おそらくリファクタリングを助けて、結果を得ることができます。 – Crisfole

答えて

2

私が考えることができる多型の最も基本的な例を作成しました。例とコメントを理解しようとすると、より具体的な質問があれば投稿を更新します。

最初のコード例には2つのクラスがあり、2番目のコード例は多態性を示すためにこれらのクラスのオブジェクトのメソッドを呼び出します。このようなものを使用して

public class BaseClass 
{ 
    // This method can be "replaced" by classes which inherit this class 
    public virtual void OverrideableMethod() 
    { 
     System.Console.WriteLine("BaseClass.OverrideableMethod()"); 
    } 

    // This method is called when the type is of your variable is "BaseClass" 
    public void Method() 
    { 
     Console.WriteLine("BaseClass.Method()"); 
    } 
} 

public class SpecializedClass : BaseClass 
{ 

    // your specialized code 
    // the original method from BaseClasse is not accessible anymore 
    public override void OverrideableMethod() 
    { 
     Console.WriteLine("SpecializedClass.OverrideableMethod()"); 

     // call the base method if you need to 
     // base.OverrideableMethod(); 
    } 

    // this method hides the Base Classes code, but it still is accessible 
    // - without the "new" keyword the compiler generates a warning 
    // - try to avoid method hiding 
    // - it is called when the type is of your variable is "SpecializedClass" 
    public new void Method() 
    { 
     Console.WriteLine("SpecializedClass.Method()"); 
    } 
} 

テストクラスは:

Console.WriteLine("testing base class"); 

BaseClass baseClass = new BaseClass(); 
baseClass.Method(); 
baseClass.OverrideableMethod(); 


Console.WriteLine("\n\ntesting specialized class"); 

SpecializedClass specializedClass = new SpecializedClass(); 
specializedClass.Method(); 
specializedClass.OverrideableMethod(); 


Console.WriteLine("\n\nuse specialized class as base class"); 

BaseClass containsSpecializedClass = specializedClass; 
containsSpecializedClass.Method(); 
containsSpecializedClass.OverrideableMethod(); 
+0

これは私が必要としていたものです – user710502

関連する問題