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

C#基类方法无法读取派生类中的实例属性,c#,python,oop,C#,Python,Oop,谁能给我解释一下吗?我知道基类不包含姓氏的定义,但我正在从DerivedClass对象调用A()方法(this.namite-this是DerivedClass的对象)DerivedClass对象包含有关姓名和姓氏的信息!为什么无法从A()方法访问姓氏?这对我来说非常有趣,因为在Python中,这个模型工作得非常好。代码如下 using System; class BaseClass { public string name; public BaseClass()

谁能给我解释一下吗?我知道
基类
不包含
姓氏
的定义,但我正在从
DerivedClass
对象调用
A()
方法(
this.namite
-
this
DerivedClass
的对象)
DerivedClass
对象包含有关
姓名和
姓氏的信息!为什么无法从
A()
方法访问
姓氏
?这对我来说非常有趣,因为在Python中,这个模型工作得非常好。代码如下

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

对不起,我的英语很差。

姓氏字段仅在派生类中可用,您应该重写派生类中的虚拟方法:

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

姓氏
字段仅在派生类中可用,您应该重写派生类中的虚方法:

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

基类不必由具有姓氏属性的类继承

正如J.vanLangen所提到的,您仍然可以使用基类声明类

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();
        }
    }
}
使用系统;
类基类
{
公共字符串名称;
公共基类()
{
this.name=“MyName”;
}
公共虚拟空间A()
{
WriteLine(“看起来我没有姓”);
}
}
类派生类:基类
{
公共字符串姓氏;
公共类()
{
this.name=“MySurname”;
}
公共覆盖无效A()
{
Console.WriteLine(这个姓);
}
}
类另一个派生类:基类
{
公共字符串IHaveNoSurname;
公共另一个派生类()
{
this.IHaveNoSurname=“嗯,我没有姓……”;
}
}
名称空间HelloWorld
{
班级计划
{
静态void Main(字符串[]参数)
{
List MyClasses=new List();
添加(新的DerivedClass());
添加(新的另一个派生类());
foreach(MyClasses中的基类MyClasse)
{
WriteLine(MyClasse.GetType());
MyClasse.A();
}
Console.ReadKey();
}
}
}
输出:

嘲笑阶级

我的名字

另一类

看来我没有姓


基类不必由具有姓氏属性的类继承

正如J.vanLangen所提到的,您仍然可以使用基类声明类

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();
        }
    }
}
使用系统;
类基类
{
公共字符串名称;
公共基类()
{
this.name=“MyName”;
}
公共虚拟空间A()
{
WriteLine(“看起来我没有姓”);
}
}
类派生类:基类
{
公共字符串姓氏;
公共类()
{
this.name=“MySurname”;
}
公共覆盖无效A()
{
Console.WriteLine(这个姓);
}
}
类另一个派生类:基类
{
公共字符串IHaveNoSurname;
公共另一个派生类()
{
this.IHaveNoSurname=“嗯,我没有姓……”;
}
}
名称空间HelloWorld
{
班级计划
{
静态void Main(字符串[]参数)
{
List MyClasses=new List();
添加(新的DerivedClass());
添加(新的另一个派生类());
foreach(MyClasses中的基类MyClasse)
{
WriteLine(MyClasse.GetType());
MyClasse.A();
}
Console.ReadKey();
}
}
}
输出:

嘲笑阶级

我的名字

另一类

看来我没有姓


python和c#之间有着根本的区别。在Python中,属性在运行时解析,在编译时解析。我认为它的设计也很糟糕,因为父类对其子类做出这样的假设不是一个好主意。
BaseClass
在编译时不知道
姓氏
指的是什么。这就是答案。您知道,在运行时,将有一个类型为继承自
BaseClass
的对象,该对象具有
姓氏
属性。但这在编译时是未知的。所以-它没有编译。很好的答案。非常感谢。python和c#之间存在根本性的差异。在Python中,属性在运行时解析,在编译时解析。我认为它的设计也很糟糕,因为父类对其子类做出这样的假设不是一个好主意。
BaseClass
在编译时不知道
姓氏
指的是什么。这就是答案。您知道,在运行时,将有一个类型为继承自
BaseClass
的对象,该对象具有
姓氏
属性。但这在编译时是未知的。所以-它没有编译。很好的答案。非常感谢。可能重复的