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

  实例说明:

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

  思路总览: 

C# 工厂模式+虚方法(接口、抽象方法)实现多态的更多相关文章

  1. C#类、接口、虚方法和抽象方法0322

    虚拟方法和抽象方法有什么区别与联系: 1.抽象方法只有声明没有实现代码,需要在子类中实现:虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现. 2.抽象类不能被实例化(不可 ...

  2. 虚方法(virtual)\抽象方法(abstract)\接口(interface)的区别

    转自:https://www.cnblogs.com/fantaohaoyou/p/9402657.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽 ...

  3. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

    1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...

  4. C#中的虚方法和抽象方法(Thirteenth Day)

    今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用. 理论: 虚方法: •用virtual修饰的方法叫做虚方法 •虚方法可以在子类中通过override关键字来重写 •常见的虚方法 ...

  5. C#虚方法和抽象方法的区别

    一,如下例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespa ...

  6. C# 虚方法、抽象方法

    一.虚方法(virtual) 作用:当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法. 示例: class Person { public virtual void XXX() { Con ...

  7. 工厂模式 jdbc 面向接口dao 开发 单例

    package com.itheima.utils; import java.io.IOException; import java.io.InputStream; import java.util. ...

  8. 虚方法(virtual)和抽象方法(abstract)的和接口(interface)的区别

    虚方法(virtual)和抽象方法(abstract)的区别 2017年06月15日 13:41:26 阅读数:65 注:本文转载自 http://www.cnblogs.com/michaelxu/ ...

  9. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

随机推荐

  1. C语言 · 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  2. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  3. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  4. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  5. .net erp(办公oa)开发平台架构概要说明之表单设计器

    背景:搭建一个适合公司erp业务的开发平台.   架构概要图: 表单设计开发部署示例图    表单设计开发部署示例说明1)每个开发人员可以自己部署表单设计至本地一份(当然也可以共用一套开发环境,但是如 ...

  6. iOS逆向工程之Theos

    如果你对iOS逆向工程有所了解,那么你对Tweak并不陌生.那么由Tweak我们又会引出Theos, 那么什么是Theos呢,简单一句话,Theos是一个越狱开发工具包,Theos是越狱开发工具的首先 ...

  7. javascript函数

    array.sort(function(a, b){ return a -b ; } )   把数组 array 按照从小到大排序. [11, 22, 586, 10, -58, 86].sort(f ...

  8. JAVA面试题

    在这里我将收录我面试过程中遇到的一些好玩的面试题目 第一个面试题:ABC问题,有三个线程,工作的内容分别是打印出"A""B""C",需要做的 ...

  9. 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor

    当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...

  10. 餐饮连锁公司IT信息化解决方案一

             从餐饮企业的信息化需求来说,没有哪一种解决方案能满足所有餐饮企业的信息化建设需要.不同的餐饮业态有不同的业务流程,不同业态的信息化解决方案是目前餐饮企业信息化建设急需的,这种一站式整 ...