Метод базового класса C # не может прочитать атрибут экземпляра, который находится в производном классе - PullRequest
0 голосов
/ 28 августа 2018
using System;

class BaseClass
{

    public string name;

    public BaseClass()
    {
        this.name = "MyName";
    }

    public virtual void A()
    {
        Console.WriteLine(this.surname); // error. BaseClass does not definition of surname
    }

}

class DerivedClass : BaseClass
{
    public string surname;

    public DerivedClass()
    {
        this.surname = "MySurname";
    }
}

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {

            DerivedClass dc = new DerivedClass();
            dc.A();

            Console.ReadKey();
        }
    }
}

Кто-нибудь может мне это объяснить? Я знаю, что BaseClass не содержит определения surname, но я вызываю A() метод из DerivedClass объекта (this.surname - this является объектом DerivedClass). DerivedClass объект содержит информацию о name и surname! Почему невозможно получить доступ к surname из метода A()? Это очень интересно для меня, потому что в Python эта модель работает отлично. Код ниже.

class BaseClass:

    def __init__(self):
        self.name = 'MyName'

    def a(self):
        print(self.surname)

class DerivedClass(BaseClass):

    def __init__(self):
        super().__init__()
        self.surname = 'MySurname'

if __name__ == '__main__':
    dc = DerivedClass()
    dc.a()

Извините за мой плохой английский.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Ваш базовый класс необязательно наследуется классом со свойством фамилии.

Как упоминал Дж. Ван Ланген, вы все еще можете объявлять классы, используя их базовый класс

using System;

class BaseClass
{
    public string name;

    public BaseClass()
    {
        this.name = "MyName";
    }

    public virtual void A()
    {
        Console.WriteLine("Looks like I have no surname");
    }
}

class DerivedClass : BaseClass
{
    public string surname;

    public DerivedClass()
    {
        this.surname = "MySurname";
    }

    public override void A()
    {
        Console.WriteLine(this.surname);
    }
}

class AnotherDerivedClass : BaseClass
{
    public string IHaveNoSurname;

    public AnotherDerivedClass()
    {
        this.IHaveNoSurname = "Well, no surname for me...";
    }
}

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            List<BaseClass> MyClasses = new List<BaseClass>();
            MyClasses.Add(new DerivedClass());
            MyClasses.Add(new AnotherDerivedClass());

            foreach (BaseClass MyClasse in MyClasses)
            {
                Console.WriteLine(MyClasse.GetType());
                MyClasse.A();
            }
            Console.ReadKey();
        }
    }
}

Выход:

DerivedClass

MySurname

AnotherDerivedClass

Похоже, у меня нет фамилии

0 голосов
/ 28 августа 2018

Поле surname доступно только в производном классе, вам следует переопределить виртуальный метод в производном классе:

using System;

class BaseClass
{

    public string name;

    public BaseClass()
    {
        this.name = "MyName";
    }

    public virtual void A()
    {
        Console.WriteLine($"Hi {name}, I don't know your surname here");
    }

}

class DerivedClass : BaseClass
{
    public string surname;

    public DerivedClass()
    {
        this.surname = "MySurname";
    }

   // HERE:
    public override void A()
    {
        // the 'this' and 'base' are just for clarification and are optional.
        Console.WriteLine($"Hi {base.name} {this.surname}, how are you.");
    }
}

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {

            DerivedClass dc = new DerivedClass();
            dc.A();

            // It's even possible to store the derived class in a base class variable
            BaseClass bc = new DerivedClass();
            bc.A(); // it will still execute the overriden method.

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