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()
对不起,我的英语不好。
答案 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
好像我没有姓