new
หมายถึงเคารพประเภทการอ้างอิงของคุณ (ด้านซ้ายมือ=
) ดังนั้นจึงใช้วิธีการของประเภทการอ้างอิง หากวิธีการที่นิยามใหม่ไม่มีnew
คำหลักมันจะทำงานเหมือนที่มันเป็น นอกจากนี้ยังเป็นที่รู้จักกันเป็นมรดกที่ไม่ใช่ polymorphic นั่นคือ“ ฉันกำลังสร้างวิธีการใหม่เอี่ยมในคลาสที่ได้มาซึ่งไม่มีอะไรเกี่ยวข้องกับวิธีการใด ๆ ด้วยชื่อเดียวกันในคลาสพื้นฐาน” - โดยวิเทเกอร์กล่าว
override
ซึ่งจะต้องใช้กับvirtual
คำหลักในระดับฐานของมันหมายถึงเคารพประเภท OBJECT ของคุณ (ด้านขวามือของ=
) ซึ่งจะทำให้วิธีการทำงานลดลงโดยไม่คำนึงถึงประเภทการอ้างอิง นอกจากนี้ยังเป็นที่รู้จักมรดก polymorphic
วิธีที่ฉันควรคำนึงถึงคำหลักทั้งสองที่อยู่ตรงข้ามกัน
override
: virtual
คำหลักจะต้องกำหนดเพื่อแทนที่วิธี วิธีการใช้override
คำสำคัญที่ไม่คำนึงถึงประเภทการอ้างอิง (การอ้างอิงของคลาสฐานหรือคลาสที่ได้รับ) หากมีการสร้างอินสแตนซ์ของคลาสพื้นฐานเมธอดของคลาสพื้นฐานจะทำงาน มิฉะนั้นวิธีการเรียนที่ได้รับการทำงาน
new
: หากวิธีการใช้override
คำหลักซึ่งแตกต่างจากคำหลักประเภทการอ้างอิงเป็นสิ่งสำคัญ หากมีการสร้างอินสแตนซ์ของคลาสที่ได้รับและประเภทการอ้างอิงคือคลาสพื้นฐานเมธอดของคลาสพื้นฐานจะทำงาน หากมีการสร้างอินสแตนซ์ของคลาสที่ได้รับและประเภทการอ้างอิงคือคลาสที่ได้รับเมธอดของคลาสที่ได้รับมาจะทำงาน กล่าวคือมันต่างจากoverride
คำหลัก ถ้าคุณลืมหรือไม่ใส่คำหลักใหม่ลงในเมธอดคอมไพเลอร์จะทำงานตามค่าเริ่มต้นเมื่อใช้new
คำหลัก
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
โทรเข้าหลัก:
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
เอาท์พุท:
A
B
B
base test
derived test
ตัวอย่างรหัสใหม่
เล่นกับรหัสโดยแสดงความคิดเห็นในแบบหนึ่งต่อหนึ่ง
class X
{
protected internal /*virtual*/ void Method()
{
WriteLine("X");
}
}
class Y : X
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Y");
}
}
class Z : Y
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Z");
}
}
class Programxyz
{
private static void Main(string[] args)
{
X v = new Z();
//Y v = new Z();
//Z v = new Z();
v.Method();
}