原文地址:http://www.dingos.cn/index.php?topic=1989.0
通常多态可以分成两种类型:
1. 静态绑定
2. 动态绑定
1. 静态绑定
2. 动态绑定
编译器在编译时知道自己,什么是要做的事情。(例如:什么时候调用什么方法?)
函数重载属于这一类。
函数重载可以采取两种方式:
1. 使用相同的函数名,但传递的参数不同。
2. 使用相同的函数名,但参数的类型不同。
函数重载属于这一类。
函数重载可以采取两种方式:
1. 使用相同的函数名,但传递的参数不同。
2. 使用相同的函数名,但参数的类型不同。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace sampleClass{
class Program{
static void Main(string[] args){
sampleClass objSampleClass = new sampleClass();
// 调用相同的函数名,但传递的参数个数不同
objSampleClass.sampleMethod();
objSampleClass.sampleMethod("Hai");
objSampleClass.sampleMethod("Hai", "Welcome");
// 调用相同的函数名,但传递的参数类型不同
objSampleClass.sampleMethod(1);
Console.ReadLine();
}
}
class sampleClass{
public void sampleMethod(){
Console.WriteLine("Method with no parameters");
}
public void sampleMethod(string param){
Console.WriteLine("Method with one parameters"
+ " The value passed is {0}", param);
}
public void sampleMethod(string param1, string param2) {
Console.WriteLine("Method with Two parameters"
+ " The value passed is {0} and {1}", param1, param2);
}
// 函数的参数个数相同,但参数类型不同
public void sampleMethod(int param){
Console.WriteLine("Method with one parameters, But with different input type"
+ " The value passed is {0}", param);
}
}
}
using System.Linq;
using System.Text;
namespace sampleClass{
class Program{
static void Main(string[] args){
sampleClass objSampleClass = new sampleClass();
// 调用相同的函数名,但传递的参数个数不同
objSampleClass.sampleMethod();
objSampleClass.sampleMethod("Hai");
objSampleClass.sampleMethod("Hai", "Welcome");
// 调用相同的函数名,但传递的参数类型不同
objSampleClass.sampleMethod(1);
Console.ReadLine();
}
}
class sampleClass{
public void sampleMethod(){
Console.WriteLine("Method with no parameters");
}
public void sampleMethod(string param){
Console.WriteLine("Method with one parameters"
+ " The value passed is {0}", param);
}
public void sampleMethod(string param1, string param2) {
Console.WriteLine("Method with Two parameters"
+ " The value passed is {0} and {1}", param1, param2);
}
// 函数的参数个数相同,但参数类型不同
public void sampleMethod(int param){
Console.WriteLine("Method with one parameters, But with different input type"
+ " The value passed is {0}", param);
}
}
}
只有在运行时,编译器才知道调用或绑定哪个方法。是通过虚方法来实现。
1. 在基类中使用virtual关键字通知编译器这个方法可能在子类中重写。
2. 在子类中使用override关键字中重写基类的方法。
using System;
1. 在基类中使用virtual关键字通知编译器这个方法可能在子类中重写。
2. 在子类中使用override关键字中重写基类的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace virtualMethods{
class Program{
static void Main(string[] args){
sampleDerivedClass objsampleDerivedClass = new sampleDerivedClass();
objsampleDerivedClass.printMethod();
Console.ReadLine();
}
}
class sampleBaseClass{
virtual public void printMethod(){
Console.WriteLine("I am in BaseClass Method");
}
}
class sampleDerivedClass : sampleBaseClass{
public override void printMethod(){
Console.WriteLine("I am in DerivedClass Method");
// 调用基类的方法
base.printMethod();
}
}
}
using System.Linq;
using System.Text;
namespace virtualMethods{
class Program{
static void Main(string[] args){
sampleDerivedClass objsampleDerivedClass = new sampleDerivedClass();
objsampleDerivedClass.printMethod();
Console.ReadLine();
}
}
class sampleBaseClass{
virtual public void printMethod(){
Console.WriteLine("I am in BaseClass Method");
}
}
class sampleDerivedClass : sampleBaseClass{
public override void printMethod(){
Console.WriteLine("I am in DerivedClass Method");
// 调用基类的方法
base.printMethod();
}
}
}