производный класс не может отображать значение переменных базового класса в C # - PullRequest
0 голосов
/ 07 января 2010

Я пытаюсь выполнить следующий код

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 (значение a) как вывод, когда я делаю aa.show(), где aa - это экземпляр A, но когда я делаю bb.show(), где bb - это Экземпляр B, вывод получается как 0 (значение a) z (значение b).

Может кто-нибудь объяснить, почему производный класс не может отображать текущее значение, даже если он был объявлен защищенным, тогда как он может отображать правильное значение b?

Обновление:

Я попробую предложенные решения. Что касается ошибки компиляции, ее не было, и я смог получить результат, как указано в вопросе.

Ответы [ 8 ]

9 голосов
/ 07 января 2010

Ваш метод B скрывает метод A, вы должны получить предупреждение компилятора об этом.

Лучше так: обратите внимание на виртуальные и переопределить ключевые слова:

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);
    }
}

Но здесь у вас появятся два окна с сообщениями. Необходимо разделить настройку переменной в A с помощью функции окна сообщения, например, установить «a» в конструкторе.

2 голосов
/ 07 января 2010

Попробуйте следующее:

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); 
     } 
} 
1 голос
/ 07 января 2010

Вы, вероятно, получаете предупреждение о сборке, как это, не так ли?

Предупреждение 1 'ConsoleApplication7.B.Show ()' скрывает унаследованный член 'ConsoleApplication7.A.Show ()'. использование новое ключевое слово, если скрытие было предназначена. C: \ Документы и Настройки \ jhoover.ANDT \ Мои Документы \ Visual Studio 2005 \ Projects \ ConsoleApplication7 \ ConsoleApplication7 \ Program.cs 25 21 ConsoleApplication7

Как упоминает Паоло, Б.Шоу скрывает А.Шоу (). Код Веблеу показывает, как сделать то, что вы хотите, сделав виртуальный A.Show () и отметив B.Show () ключевым словом override.

P.S. Не используйте "" + a для преобразования в строку, используйте a.ToString ()

1 голос
/ 07 января 2010

Если вы установите значение внешнего метода Show () в классе A, вы получите ожидаемый результат. Реализация B.Show скрывает A.Show, поэтому она никогда не выполняется.

0 голосов
/ 07 января 2010

Использовать шаблон Шаблонный метод 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;
 }
}
0 голосов
/ 07 января 2010

а = 5; устанавливается в вашем методе A.Show.

Класс B никогда не установит a = 5, потому что он будет использовать метод B.Show.

Вопрос не совсем корректен: почему производный класс не может отобразить текущее значение ?

Производный класс может отображать значение a, но это значение никогда не менялось со значения по умолчанию 0 в классе B.

попробуйте также инициализировать внешний вид Show (), например:

class A {
    protected int a = 5; // a = 5 will be visible in B too
0 голосов
/ 07 января 2010

Вы должны инициализировать значение a в конструкторе класса или другом методе.
Show() объявлено в B классе скрывается Show() объявлено в A классе, поэтому метод класса A не вызывается.

Подробнее о полиморфизме и наследовании в C ++ и C #.

например. Вы можете быть удивлены результатами такого куска кода:

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

; -)

0 голосов
/ 07 января 2010

Текущее значение a в bb.show () равно 0, поэтому вывод верен. Вы устанавливаете его на 5 только в методе Show в классе A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...