![](/img/trans.png)
[英]in C# how to invoke base class method, which already override in derived class, from derived class instance
[英]C# base class method can not read instance attribute which is in derived class
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
! 為什么不可能通過A()
方法訪問surname
? 這對我來說非常有趣,因為在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()
對不起,我的英語不好。
surname
字段僅在Derived類中可用,您應該在派生類中覆蓋虛擬方法:
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();
}
}
}
您的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
看起來我沒有姓
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.