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();
}
}
}
}
}
思路总览:

C# 工厂模式+虚方法(接口、抽象方法)实现多态的更多相关文章
- C#类、接口、虚方法和抽象方法0322
虚拟方法和抽象方法有什么区别与联系: 1.抽象方法只有声明没有实现代码,需要在子类中实现:虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现. 2.抽象类不能被实例化(不可 ...
- 虚方法(virtual)\抽象方法(abstract)\接口(interface)的区别
转自:https://www.cnblogs.com/fantaohaoyou/p/9402657.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽 ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...
- C#中的虚方法和抽象方法(Thirteenth Day)
今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用. 理论: 虚方法: •用virtual修饰的方法叫做虚方法 •虚方法可以在子类中通过override关键字来重写 •常见的虚方法 ...
- C#虚方法和抽象方法的区别
一,如下例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespa ...
- C# 虚方法、抽象方法
一.虚方法(virtual) 作用:当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法. 示例: class Person { public virtual void XXX() { Con ...
- 工厂模式 jdbc 面向接口dao 开发 单例
package com.itheima.utils; import java.io.IOException; import java.io.InputStream; import java.util. ...
- 虚方法(virtual)和抽象方法(abstract)的和接口(interface)的区别
虚方法(virtual)和抽象方法(abstract)的区别 2017年06月15日 13:41:26 阅读数:65 注:本文转载自 http://www.cnblogs.com/michaelxu/ ...
- 从接口、抽象类到工厂模式再到JVM来总结一些问题
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...
随机推荐
- opencv在图像显示中文
在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...
- 用scikit-learn进行LDA降维
在线性判别分析LDA原理总结中,我们对LDA降维的原理做了总结,这里我们就对scikit-learn中LDA的降维使用做一个总结. 1. 对scikit-learn中LDA类概述 在scikit-le ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- PHP源码分析-变量
1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...
- Partition2:对表分区
在SQL Server中,普通表可以转化为分区表,而分区表不能转化为普通表,普通表转化成分区表的过程是不可逆的,将普通表转化为分区表的方法是: 在分区架构(Partition Scheme)上创建聚集 ...
- python开发环境搭建
虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...
- WPF 捕获键盘输入事件
最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...
- SpringMVC+Shiro权限管理【转】
1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...