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();
                        }
                    }
                }
            }
        }    

      思路总览: 

  • 相关阅读:
    Sql Server常见错误
    sql server复制需要有实际的服务器名称才能连接到服务器
    学习WCF必备网址
    利用Httphandler、UserControl 输出HTML片段
    SQL点滴—性能分析之执行计划
    我的WCF开发框架简化版及基于NET.TCP传输方式的实现
    数据库优化建议
    实现jQuery扩展总结
    【模板】zkw线段树
    洛谷 P1960 列队
  • 原文地址:https://www.cnblogs.com/njfan/p/6143767.html
Copyright © 2011-2022 走看看