C#中继承和多态的研究
通常继承
在这个部分,我将构建两个类
A
和B
,B
是A
的子类。
namespace CSharpPolymorphism {
class A {
public string value = "A";
public string Say() { return "I'm A, My Value: " + value; }
}
class B : A {
public string value = "B";
public string Say() { return "I'm B, My Value: " + value; }
}
class Program {
static void Main(string[] args) {
A Aa = new A();
B Bb = new B();
A Ab = new B();
Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
// Pause
Console.ReadLine();
}
}
}
运行结果为:
// I'm A, My Value: A, Got Value: A
// I'm B, My Value: B, Got Value: B
// I'm A, My Value: A, Got Value: A
结果说明: I'm N 表示调用了N的方法, My Value: N 表示方法内部获取到的值, Got Value: N 表示从外部直接访问对象属性得到的值。
由此可见,通常继承中,若使用子类来实例化父类对象,不论从类的内部还是外部访问这个对象,这个对象都会使用父类的属性和方法。
父类定义虚方法,子类新建方法
在这个部分,我将构建两个类
A
和B
,B
是A
的子类。A
中的方法定义为virtual
虚方法,B
中方法定义为new
新建方法。
namespace CSharpPolymorphism {
class A {
public string value = "A";
public virtual string Say() { return "I'm A, My Value: " + value; }
}
class B : A {
public string value = "B";
public new string Say() { return "I'm B, My Value: " + value; }
}
class Program {
static void Main(string[] args) {
A Aa = new A();
B Bb = new B();
A Ab = new B();
Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
// Pause
Console.ReadLine();
}
}
}
运行结果为:
// I'm A, My Value: A, Got Value: A
// I'm B, My Value: B, Got Value: B
// I'm A, My Value: A, Got Value: A
与前面的例子结果一样,当子类新建父类的虚方法时,若使用子类来实例化父类对象,不论从类的内部还是外部访问这个对象,这个对象都会使用父类的属性和方法。
父类定义虚方法,子类覆盖方法
在这个部分,我将构建两个类
A
和B
,B
是A
的子类。A
中的方法定义为virtual
虚方法,B
中方法定义为override
覆盖方法。
namespace CSharpPolymorphism {
class A {
public string value = "A";
public virtual string Say() { return "I'm A, My Value: " + value; }
}
class B : A {
public string value = "B";
public override string Say() { return "I'm B, My Value: " + value; }
}
class Program {
static void Main(string[] args) {
A Aa = new A();
B Bb = new B();
A Ab = new B();
Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
// Pause
Console.ReadLine();
}
}
}
运行结果为:
// I'm A, My Value: A, Got Value: A
// I'm B, My Value: B, Got Value: B
// I'm B, My Value: B, Got Value: A
在这个例子中,若使用子类来实例化父类对象,会调用子类的方法,而且在方法中获取的属性值是子类的,但是从外部直接访问这个对象的属性时,会使用父类对象的属性值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。