C#基类方法无法读取派生类中的实例属性

时间:2018-08-28 13:03:16

标签: c# python oop

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-thisDerivedClass的对象)。 DerivedClass对象包含有关namesurname的信息!为什么无法通过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 :(得分:3)

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

答案 1 :(得分:0)

您的baseClass不必由具有surname属性的类继承。

如J. van Langen所述,您仍然可以使用其基类声明类

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

     

我的姓氏

     

AnotherDerivedClass

     

好像我没有姓