2012-03-25 9 views
-1

... カスタマイズアクセス継承された機能のC#、JavaやC++と

我々持っている以下のクラス

class A 
{ 
    void x(){y();} 
    void y(){} 
} 

class B :A 
{ 
    void y(){}; 
    void a(){x();} 
} 

//in main or somewhere 
B b=new B(); 
b.a(); 

機能「」それはベースを呼び出しますと呼ばれている「X」機能

問題は、関数 "x"が(y())/ derived(y)を呼び出す関数ですか? とどのように制御することができますか?

注:3つの言語が同じではないということを私は知っています。

+1

を作るために、すべての3つの言語でのサンプルである一つの言語を選択してください;構文とセマンティクスはそれぞれ異なります。 –

+1

@OliCharlesworth:私は同意しません。質問は明らかです。そして、上記を3つの言語のそれぞれにどのように翻訳するのかは非常に明白です。 –

+0

氏@OliCharlesworthちょうど概念を取る、私は3つの言語が同じではないが誰が書くことができます知っている(C + +/JAVA/C#)コードを読んで理解することができます – Hilmi

答えて

2

(publicとして、すべてを宣言し、各言語のための適切な構文を使用するためのものと仮定して)

JavaやC#ではそれがBを呼び出します:: Y。

C++では、A :: yを呼び出します。

C :: ++では、A :: yをという仮想のと宣言していた場合は、代わりにB :: yを呼び出します。

静的ディスパッチ(A :: y)の実装はダイナミックディスパッチ(B :: y)よりも優れているので、オプションはC++で開いたままにしておきます(仮想または非仮想)。 JavaとC#では、言語設計者はそれを単純にし、動的ディスパッチのみを許可することにしました。そのため、静的ディスパッチ(A :: y)を行う方法はありません。

2

あなたのコードは有効ではありませんが、B * b = new B; b->a();と書かれている場合は、ではないのでA::y()が呼び出されます。 Javaでは、すべて非静的メンバー関数は暗黙的に仮想なので、B::y()が呼び出されます。

「アクセス」はまったく異なるものです(publicprivateなど)。あなたの質問は非常に誤解を招きます。その点に関しては、B::a()publicではないため、コードはどの言語でもコンパイルされません。

+0

あなたの答えは、概念と誰でも書くことができる人は(C++/JAVA/C#)コードを読んで理解することができます。 – Hilmi

2

このコードサンプルは、ここで使用している言語に非常に依存しています。あなたの質問はC#/ C++とJavaをここで言及しており、上記の基本パターンとは異なります。

C#とC++は、関数がデフォルトでは仮想ではないという点ではかなり似ています。したがって、x()の呼び出しは、を参照してx()を参照します。 Javaでは、メソッドはデフォルトでは仮想であるため、実際のタイプはthisに応じてA::yまたはB::yのいずれかを参照します。ここで

y()は仮想呼び出し可能

C++

class A { 
public: 
    void x(){ y(); } 
    virtual void y(){} 
}; 

class B : public A { 
public: 
    // virtual not needed here but nice 
    virtual void y() { }; 
    void a() { x(); } 
}; 


B* b = new B(); 
b->a(); 

C#

class A { 
    public void x(){ y(); } 
    public virtual void y(){} 
} 

class B : public A { 
    public overrides void y() { }; 
    public void a() { x(); } 
}; 


B b = new B(); 
b.a(); 

のJava

class A { 
    public void x(){ y(); } 
    public void y(){} 
} 

class B : inherits A { 
    public void y() { }; 
    public void a() { x(); } 
}; 

B b = new B(); 
b.a();