如果要簡要的描述多態的話,我個人是這樣理解的:通過繼承,父類定義方法,具休的實現由子類進行。
//父類
class Person
{
public virtual void skill() //vitrual -虛方法,方法可被重寫
{
Console.WriteLine("人會走路");
}
}
class Xiaoming:Person
{
public override void skill() //重寫父類方法
{
Console.WriteLine("小明會唱歌");
}
}
class XiaoHu : Person
{
public override void skill()
{
Console.WriteLine("小虎會游泳");
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Xiaoming();//裡氏轉換原則 可以將子類賦值給父類
Person p2 = new XiaoHu();
p1.skill();
p2.skill();
Console.ReadKey();
}
}
輸出:

通過這個例子 Person 類定義了skill方法,方法的具體實現由子類進行。
即 如果子類的 override 改為new 那麼父類和子類的方法是獨立的,此時執行下面的代碼
//父類
class Person
{
public virtual void skill()
{
Console.WriteLine("人會走路");
}
}
class Xiaoming:Person
{
public new void skill() //重寫父類方法
{
Console.WriteLine("小明會唱歌");
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Xiaoming();//裡氏轉原則
Xiaoming p2 = new Xiaoming();
p1.skill();
p2.skill();
Console.ReadKey();
}
}
輸出:

可以看出,p.skill();這裡看.前面的對象,是什麼類型的,就執行那個類裡裡面的 skill()方法,這裡P1是Person類的,P2是Xiaoming類的。
如果我想通過輸入 小明,小虎。 這時候系統自動給顯示小明會什麼,小虎會什麼出來。
生活中工廠是用來加工的產品的,同樣這裡也是根據傳入的參數,加工後返回對應的結果
全部代碼
//父類
class Person
{
public virtual void skill()
{
Console.WriteLine("人會走路");
}
}
class Xiaoming:Person //繼承Person
{
public override void skill() //重寫父類方法
{
Console.WriteLine("小明會唱歌");
}
}
class XiaoHu : Person
{
public override void skill()
{
Console.WriteLine("小虎會游泳");
}
}
//工廠類 --新增
class Factory
{
public static Person instance(string Name)
{
switch (Name)
{
case "1": return new Xiaoming();
case "2":return new XiaoHu();
default: return null;
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("請輸入序號查看技能,輸入1、2....");
Console.WriteLine("1.小明");
Console.WriteLine("2.小虎");
Console.WriteLine("輸入:");
string res = Console.ReadLine();
Console.WriteLine("結果:");
Person p = Factory.instance(res);
if (p != null)
{
p.skill();
}
else
{
Console.WriteLine("沒找到這個人");
}
Console.ReadKey();
}
}
執行結果:


此時,多態+簡單工廠就已經實現了。
1. 前面的 virtual(虛方) 實現多態已經完成了,其實 抽象(abstract)實現多態也是大同小異
2. abstract 和virtual的區別在於abstract 沒有方法體,方法都可以被重寫。
實現:把上面完整的代碼 的父類改成 下面就完成了,功能一樣。
//父類
abstract class Person
{
public abstract void skill();//方法沒有方法體
}
1.這裡就不是繼承了,是實現接口的方法。
2.接口的方法和抽象一樣沒有方法體。
實現:把上面完整的代碼的父類改成接口
//接口
interface Person
{
void skill();
}
然後把原來子類的 override 去掉 ,因為接口(interface)是不能被重寫(override)的。虛方法(virtual),抽象(abstract)才能被重寫
OK,接口實現多態也是完成了。