2016-07-12 3 views
1

C#では、他のオブジェクトから継承するオブジェクトがあり、継承したオブジェクトに基本オブジェクトと同じ名前の関数がある場合、継承されたオブジェクトの関数が呼び出されたときに基本オブジェクトの関数を呼び出す必要があります。私は新しいキーワードを使用しますか?そうでない場合、どのようにして両方の関数を呼び出す最良の方法ですか?ここでNewキーワードは継承したオブジェクトの関数を呼び出しますか?

は一例です:FormTestオブジェクトのRefresh関数が呼び出されたときFormオブジェクトのRefresh機能とも呼ばれた場合

public partial class FormTest : Form 
{ 
    public new void Refresh() 
    { 
     TestFunction(); 
    } 
} 

は基本的に、私が求めています。また、最初に呼び出されるFormオブジェクトのRefreshファンクションは、FormTestオブジェクトのRefreshファンクションの後に呼び出されます。

+0

_「私は継承されたオブジェクトの関数が呼び出されたベースオブジェクトの関数を呼び出すしたい場合は、」_ - むしろ、あなたがそれを呼び出す方法に依存し、または、FormTest' 'への参照は、どのようなタイプです。これをXYの問題にするのではなく、実際に何をしようとしているのか説明できますか?いずれにしても、隠しメソッドは自動的に隠しメソッドを呼び出すことはありません。 – CodeCaster

答えて

1

newキーワードを使用すると、基底クラスメソッドRefreshを非表示にする必要があることが明示されます。 Refreshこの場合、基本クラスのメソッドは呼び出されません。基本クラスメソッドを呼び出すには、FormTestクラスのRefreshメソッドでbase.Refresh()を使用します。

+0

両方の関数を呼び出す最良の方法は? – user3736648

+0

@ user3736648 'public override void Refresh() { base.Refresh(); } ' –

+0

ありがとうございます。 – user3736648

0

あなたの代わりにoverridenewキーワードを使用した場合、 派生クラスのメソッドは、それが単に それを隠し、基本クラスでメソッドをオーバーライドしません。その場合には、このようなコード:

public class Base 
{ 
    public virtual void SomeOtherMethod() 
    { 
     Console.WriteLine("Base some method"); 
    } 
} 

public class Derived : Base 
{ 
    public new void SomeOtherMethod() 
    { 
     Console.WriteLine("Derived some method"); 
    } 
}  

Base b = new Derived(); 
Derived d = new Derived(); 
b.SomeOtherMethod(); 
d.SomeOtherMethod(); 

出力
ベースいくつかの方法
あなたは、新規または上書きのいずれかを指定しない場合、結果の出力があり、いくつかの方法

を派生しました同じ と同じようにnewを指定しますが、コンパイラの警告も表示されます( は基本クラスメソッドでメソッドを隠していることに気づいていないかもしれませんが、実際にはそれを上書きしたいかもしれません)、merel yは忘れて にキーワードを含む)。

Difference between override and new

0

あなたは完全に仮想およびオーバーライドを誤解しています。 derviedクラスの仮想メソッドをオーバーライドすると、derviedクラスインスタンス経由で呼び出しているときに、基本クラスメソッドを呼び出すことはありません。あなたのケースでは

、Refreshメソッドのようなあなたのフォームクラスに仮想の場合:

public partial class Form 
{ 
    public virtual void Refresh() 
    { 
     TestFunction(); 
    } 
} 

あなたはTestFormをして、それを上書きし、TestFormをのインスタンスを経由して、それを呼び出す場合、それはalwasの最新の情報に更新メソッドを呼び出します場合TestForm。

public partial class TestForm : Form 
{ 
    public override void Refresh() 
    { 
     TestFunction(); 
    } 
} 

は今、あなたは同じようにそれを実行する場合:あなたがオーバーライドして、新しいキーワードを使用しない場合は

Form form = new TestForm(); 
    form.Refresh(); // TestForm Reresh method will be called 

    TestForm form = new TestForm(); 
    form.Refresh(); // TestForm Reresh method will be called 

、その場合は異なります。今

public partial class TestForm : Form 
{ 
    public new void Refresh() 
    { 
     TestFunction(); 
    } 
} 

あなたの場合他の結果が表示されます:

Form form = new TestForm(); 
    form.Refresh(); // Form Reresh method will be called 

    TestForm form = new TestForm(); 
    form.Refresh(); // TestForm Reresh method will be called 
1

継承された オブジェクトの関数が呼び出されたときに基本オブジェクトの関数を呼び出す場合は、新しいキーワードを使用する必要がありますか?

Newキーワードは親クラスの隠蔽方法です。これは間違いなくあなたが必要とするものではありません。子クラスのRefreshメソッドをオーバーライドし、baseキーワードを使用してForm.Refreshメソッドを呼び出す必要があります。

public partial class FormTest : Form 
{ 
    public override void Refresh() 
    { 
     TestFunction(); 
     base.Refresh(); 
    } 
} 
関連する問題