2012-10-12 4 views
5

私は、仮想メソッドの使用法がメソッド/関数のデフォルトの動作を提供することを学びました。私のクエリは、派生クラスで "new"を使用して同じ名前のメソッド(基本クラスと同じ)を実装でき、オブジェクト別に呼び出すことができるときに仮想メソッドを使用することです。例えば;私たちは、同じコンパイル時のオブジェクトを使用して、デフォルトの動作と同様に導出動作を提供などのクラスAとBの両方の時間オブジェクトを実行することができたときに、クラスAの仮想メソッドを使用しているのは、単一インスタンス生成の利点のみですか?

class A 
{ 
     public void F() 
     { 
     //default behavior 
     } 

     public virtual void G() 
     { 
     //default behavior 
     } 
} 

class B:A 
{ 
    new public void F() 
    { 
     //new behavior from that of class A 
    } 
    public override void G() 
    { 
     //new behavior from that of class A 
    } 
} 

class Test 
{ 
    public static void Main(string[] args) 
    { 
     //For calling A's method use same compile time and run time object 
     A obj1 = new A(); 

     //For calling B's method use compile time object of A and run time of B 
     A obj2 = new B(); 

     obj1.F(); //O/P is A's method result 
     obj2.F(); //O/P is A's method result 
     obj1.G(); //O/P is A's method result 
     obj2.G(); //O/P is B's method result 
} 

私の質問は、なぜ仮想G(ある)が必要とされています。

A obj1 = new A(); //for calling A's methods 
B obj2 = new B(); //for calling B's methods 
A obj3 = new B(); //for having default behavior of class A using B's run time object. 

私がフェッチしたのは、バーチャルの場合、同じコンパイルとランタイムタイプのオブジェクトをもう1つ作成する必要はありません。これは、タイプAのコンパイル時とタイプBの実行時である単一のオブジェクトによって実現することができます。

答えて

6

私の疑問は、クラスAの仮想G()が同じものを使用してデフォルトの動作を提供できる場合です時間をコンパイルし、Aの時刻オブジェクトをコンパイルして、すでにおよそBを知っているのみ利用コードはできるのでB.

の時間を実行して使用することにより、時間オブジェクトと派生行動を実行します。ポリモーフィズムのポイントの半分は、実際にどのサブクラスを扱うか気にしないコードを書くことができます。

たとえば、仮想ストリームまたは抽象メソッドであるため、Stream.ReadStream.Writeを使用してストリームのコンテンツを別のストリームにコピーする方法を記述できます。どの実装が渡されるかは関係ありません

newをメソッド修飾子として使用することはほとんどありません。非仮想メソッドに対して異なる動作を実際に提供したい場合は、まったく異なるコードを読む人は、これが基本クラスで宣言されたメソッドとは非常に別のメソッドであることを理解できるようになります。

+0

おそらく私の心は返信によって解決されません...私はそれをはっきりと得ることができません。より現実的な感触を与えることができますか、迅速な答えのためにはいありがとうございます。 – user1740176

+0

「よりリアルなタッチ」が何を意味するのか分かりません。 –

+0

ご迷惑をおかけして申し訳ありません。私はそれを求めようとしていました:仮想メソッドの使用はメモリだけを節約していますか?もっと多くのオブジェクトを作成しないようにするか、それとも異なる理由もありますか?リアルなタッチで、私は実生活の例を意味しました。 – user1740176

0

Jonは、新しいものを使用する実装を非表示にすると、ベースクラスのメソッドへの参照はベースの実装になりますが、ベースクラスの場合でもオーバーライドするメソッドを使用すると、

クラスがfooをオーバーライドすると、呼び出し元の効果が変更されます。これは、AbstractTemplateなどの特定のデザインパターンの基礎です

+0

返信いただきありがとうございます。謝罪、あなたの例を得ることができませんでした。 – user1740176

関連する問題