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
的对象,该对象具有姓氏
属性。但这在编译时是未知的。所以-它没有编译。很好的答案。非常感谢。可能重复的