0

次のコードを実行しようとしています

class A
{
    protected int a;
    protected char b;
    public void Show()
    {
        a=5;
        MessageBox.Show(""+a);
    }
}

class B:A
{
    public void Show()
    {
        b='z';
        MessageBox.Show(""+a+ ""+b);
    }
}

を実行すると、出力として5(の値)が取得されますが、実行すると、出力は(の値) (の値) として出力されます。aaa.show()aaAbb.show()bbB0azb

の正しい値を表示できるのに、保護されていると宣言されているにもかかわらず、派生クラスが a の現在の値を表示できない理由を誰かが説明できますbか?

アップデート:

提案された解決策を試してみます。コンパイルエラーはありませんでしたし、質問にある通りの出力を得ることができました。

4

8 に答える 8

9

あなたの B メソッドは A メソッドを隠しています。これについてコンパイラの警告が表示されるはずです。

より良いのは次のとおりです- virtual および override キーワードに注意してください。

class A
{
    protected int a;
    protected char b;
    public virtual void Show()
    {
        a=5;
        MessageBox.Show(""+a);
    }
}
class B:A
{
    public override void Show()
    {
        base.Show();
        b='z';
        MessageBox.Show(""+a+ ""+b);
    }
}

しかし、ここでは 2 つのメッセージ ボックスが表示されます。A の変数の設定をメッセージ ボックス関数で分離する必要があります。たとえば、コンストラクターで 'a' を設定します。

于 2010-01-07T15:04:51.437 に答える
2

次のことを試してください。

class A 
{ 
    protected int a; 
    protected char b; 
    public virtual void Show() 
    { 
        a=5; 
        MessageBox.Show(""+a); 
    } 
} 

class B:A 
{ 
     public override void Show() 
     { 
         b='z'; 
         MessageBox.Show(""+a+ ""+b); 
     } 
} 
于 2010-01-07T15:07:50.620 に答える
1

おそらく、このようなビルド警告がありますよね?

警告 1 'ConsoleApplication7.B.Show()' は、継承されたメンバー 'ConsoleApplication7.A.Show()' を非表示にします。非表示が意図されている場合は、new キーワードを使用します。C:\Documents and Settings\jhoover.ANDT\My Documents\Visual Studio 2005\Projects\ConsoleApplication7\ConsoleApplication7\Program.cs 25 21 ConsoleApplication7

パオロが言及しているように、B.Show は A.Show() を隠しています。Webleeuw のコードは、A.Show() を仮想化し、B.Show() をオーバーライド キーワードでマークすることによって、必要なことを行う方法を示しています。

PS ""+a を使用して文字列に変換しないでください。a.ToString() を使用してください。

于 2010-01-07T15:12:19.877 に答える
1

クラス A の Show() メソッドの外側の値を設定すると、期待どおりの結果が得られます。B.Show の実装は A.Show を隠すため、決して実行されません。

于 2010-01-07T15:07:14.037 に答える
0

a=5; A.Show メソッドで設定されます。

B クラスは B.Show メソッドを使用するため、a=5 を設定することはありません。

質問は完全に正しくありません:派生クラスが a の現在の値を表示できないのはなぜですか?

派生クラスは a 値を表示できますが、このa 値は B クラスでデフォルトの 0 から変更されることはありません。

次のように Show() の外側も初期化してみてください。

class A {
    protected int a = 5; // a = 5 will be visible in B too
于 2010-01-07T15:10:23.390 に答える
0

bb.show() の現在の a の値は 0 なので、出力は正しいです。A クラスの Show メソッドでのみ 5 に設定します。

于 2010-01-07T15:08:41.617 に答える
0

aクラスコンストラクターまたは他のメソッドでの値を初期化する必要があります。クラスで
Show()宣言されたクラスはクラスで宣言されていないため、クラスのメソッドは呼び出されません。BShow()AA

C++ と C# でのポリモーフィズムと継承の詳細を参照してください。

たとえば、そのようなコードの結果に驚かれることがあります。

A aa;
B bb;
//... init vars ...
aa = bb;
bb.Show();
aa.Show();
bb.Show();

;-)

于 2010-01-07T15:09:02.520 に答える
-2

テンプレートメソッドパターンを使用するhttp://en.wikipedia.org/wiki/Template_method_pattern

class A
{
 protected int a;

 protected virtual string GetForShow()
 {
  a = 5;
  return a.ToString();
 }
 public void Show()
 {
  var forShow = GetForShow();
  MessageBox.Show(forShow);
 }
}
class B
{
 protected char b;
 protected override string GetForShow()
 {
  b = 'z';
  return base.GetForShow() + b;
 }
}
于 2010-01-07T15:20:06.320 に答える