面向對象語言的三大特征之一就是多態,聽起來多態比較抽象,簡而言之就是同一行為針對不同對象得到不同的結果,同一對象,在不同的環境下得到不同的狀態。 實例說明: 業務需求:實現一個打開文件的控制台程式的demo,針對不同文件類型使用不同方式打開。 在這個案列中多態的要素 “同一行為”在這個實例中指的就是 ...
面向對象語言的三大特征之一就是多態,聽起來多態比較抽象,簡而言之就是同一行為針對不同對象得到不同的結果,同一對象,在不同的環境下得到不同的狀態。
實例說明:
業務需求:實現一個打開文件的控制台程式的demo,針對不同文件類型使用不同方式打開。
在這個案列中多態的要素 “同一行為”在這個實例中指的就是“打開文件”這個行為,打開文本文件和打開音樂文件都是“打開”行為,但是不同文件打開的結果是不一樣的。
這裡我們可以把“打開文件”這一行為抽象出來,可以抽象成介面、虛方法或抽象類,這裡就把這個行為抽象成一個虛方法放在FileBase這個父類中:
class FileBase { public string file{ get; set; } public FileBase(string cmd) { file = cmd; } public virtual void open() {
// 若該類沒有被繼承,相當於沒有明確的文件類型,打開報錯 Console.WriteLine("{0}無法識別的文件!", file); } }
創建一個讀取音樂文件類MusicFile、文本文件類TxtFile,該類繼承於文件父類,並重寫打開方法:
class MusicFile:FileBase { public MusicFile(string cmd) : base(cmd) { } public override void open() { Console.WriteLine("這是一個音樂文件,是否要繼續打開?Y/N"); string operation =Console.ReadLine(); if (operation.ToLower() == "y") { Console.WriteLine("{0}音樂文件打開成功!",file); } } }
class TxtFile:FileBase { public TxtFile(string cmd) : base(cmd) { } public override void open() { Console.WriteLine("這是一個文本文件,是否要繼續打開?Y/N"); string operation =Console.ReadLine(); if (operation.ToLower() == "y") { Console.WriteLine("{0}文本文件打開成功!",file); } } }
創建一個用於實例化文件的工廠類Factory:
class Factory { public static FileBase CreateInstance(string input) { string ext = Path.GetExtension(input); switch (ext.ToLower()) { // 根據文件的擴展名返回對應的文件類 case ".mp3": return new MusicFile(input); case ".txt": return new TxtFile(input); default: return new FileBase(input); } } }
主函數Program類:
class Program { static void Main(string[] args) { while (true) { Console.Write("請輸入文件路徑:"); string input = Console.ReadLine(); if (input == "exit") { break; } else { //根據輸入路徑創建對應實例 FileBase file = Factory.CreateInstance(input); if (file != null) { file.open(); } } } } }
思路總覽: