Задать вопрос

Почему при вызове унаследованого метода он не видит значения переменных объявленные в текущем классе?

Пытаюсь разобтраться с наследованием в C#. Можно ли для методов объявленных в абстрактном классе как-то дать видеть значения, переопределенные при наследовании? И почему при передаче в функцию getText(TestAbstarctClass item) значение item.sameTextValue берется из абстрактного класса, а не его последущей реализации? Если есть толковый мануал - дайте ссылку.

abstract class TestAbstarctClass
{
    public string sameTextValue = "Abstact text";

    public virtual string Name
    {
        get { return sameTextValue; }
        set { sameTextValue = value; }
    }

    public string testFF()
    {
        return sameTextValue;
    }

}

class Concrete1TestClass : TestAbstarctClass
{
    new public string sameTextValue = "Concrete1 text";

    public override string Name
    {
        get { return sameTextValue; }
        set { sameTextValue = value; }
    }
}


class Concrete2TestClass : TestAbstarctClass
{
    new public string sameTextValue = "Concrete2 text";
}

class Tester
{
    public void getText(TestAbstarctClass item)
    {
        Debug.Log(item.sameTextValue + " / " + item.Name + " / " + item.testFF());
    }
}

////////////////////////////
        Tester t = new Tester();
        t.getText(new Concrete1TestClass()); //Abstact text / Concrete1 text / Abstact text
        t.getText(new Concrete2TestClass()); //Abstact text / Abstact text / Abstact text

        Concrete2TestClass cl2 = new Concrete2TestClass();
        Debug.Log(cl2.sameTextValue + " / " + cl2.Name + " / " + cl2.testFF()); //Concrete2 text / Abstact text / Abstact text
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
arusef
@arusef
Novice .NET dev
Потому что ключевое слово new при объявлении члена класса скрывает реализацию базового члена. Если хотите сделать член, доступный через ссылку на базовый класс - объявляйте его только в базовом классе. Если хотите переопределить реализацию виртуального метода - используйте ключевое слово override.
И вообще, вам стоит подтянуть понимание ООП.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы