zoukankan      html  css  js  c++  java
  • C# 工厂模式+虚方法(接口、抽象方法)实现多态

      面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态。

      实例说明:

      业务需求:实现一个打开文件的控制台程序的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();
                        }
                    }
                }
            }
        }    

      思路总览: 

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/njfan/p/6143767.html
Copyright © 2011-2022 走看看