C#基础巩固(1)-多态+简单工厂
多态
如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行。
01代码
//父类
class Person
{
public virtual void skill() //vitrual -虚方法,方法可被重写
{
Console.WriteLine("人会走路");
}
}
class Xiaoming:Person
{
public override void skill() //重写父类方法
{
Console.WriteLine("小明会唱歌");
}
}
class XiaoHu : Person
{
public override void skill()
{
Console.WriteLine("小虎会游泳");
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Xiaoming();//里氏转换原则 可以将子类赋值给父类
Person p2 = new XiaoHu();
p1.skill();
p2.skill(); Console.ReadKey();
}
}
输出:

通过这个例子 Person 类定义了skill方法,方法的具体实现由子类进行。
02如果不重写的话
即 如果子类的 override 改为new 那么父类和子类的方法是独立的,此时执行下面的代码
//父类
class Person
{
public virtual void skill()
{
Console.WriteLine("人会走路");
}
}
class Xiaoming:Person
{
public new void skill() //重写父类方法
{
Console.WriteLine("小明会唱歌");
}
} class Program
{
static void Main(string[] args)
{
Person p1 = new Xiaoming();//里氏转原则
Xiaoming p2 = new Xiaoming();
p1.skill();
p2.skill();
Console.ReadKey();
}
}
输出:

可以看出,p.skill();这里看.前面的对象,是什么类型的,就执行那个类里里面的 skill()方法,这里P1是Person类的,P2是Xiaoming类的。
多态+简单工厂
如果我想通过输入 小明,小虎。 这时候系统自动给显示小明会什么,小虎会什么出来。
那么首先增加一个工厂类
生活中工厂是用来加工的产品的,同样这里也是根据传入的参数,加工后返回对应的结果
全部代码
//父类
class Person
{
public virtual void skill()
{
Console.WriteLine("人会走路");
}
}
class Xiaoming:Person //继承Person
{
public override void skill() //重写父类方法
{
Console.WriteLine("小明会唱歌");
}
}
class XiaoHu : Person
{
public override void skill()
{
Console.WriteLine("小虎会游泳");
}
}
//工厂类 --新增
class Factory
{
public static Person instance(string Name)
{ switch (Name)
{
case "": return new Xiaoming();
case "":return new XiaoHu();
default: return null;
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入序号查看技能,输入1、2....");
Console.WriteLine("1.小明");
Console.WriteLine("2.小虎");
Console.WriteLine("输入:");
string res = Console.ReadLine();
Console.WriteLine("结果:");
Person p = Factory.instance(res);
if (p != null)
{
p.skill();
}
else
{
Console.WriteLine("没找到这个人");
}
Console.ReadKey();
}
}
执行结果:


此时,多态+简单工厂就已经实现了。
拓展1:抽象(abstract)实现多态
1. 前面的 virtual(虚方) 实现多态已经完成了,其实 抽象(abstract)实现多态也是大同小异
2. abstract 和virtual的区别在于abstract 没有方法体,方法都可以被重写。
实现:把上面完整的代码 的父类改成 下面就完成了,功能一样。
//父类
abstract class Person
{
public abstract void skill();//方法没有方法体 }
拓展2:接口(interface)实现多态
1.这里就不是继承了,是实现接口的方法。
2.接口的方法和抽象一样没有方法体。
实现:把上面完整的代码的父类改成接口
//接口
interface Person
{
void skill();
}
然后把原来子类的 override 去掉 ,因为接口(interface)是不能被重写(override)的。虚方法(virtual),抽象(abstract)才能被重写
OK,接口实现多态也是完成了。
C#基础巩固(1)-多态+简单工厂的更多相关文章
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 基础学习day08---多态、简单工厂、Object类equals和toString
一.多态 1.1.多态概念 定义:某一类事物的多种存在形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型:猫 x = new 猫(); 同时猫也是动物中的一种,也可以 ...
- java:面向对象(多态,final,抽象方法,(简单工厂模式即静态方法模式),接口)
* 生活中的多态:同一种物质,因环境不同而表现不同的形态. * 程序中多态:同一个"接口",因不同的实现而执行不同的操作. * 多态和方法的重写经常结合使用,子类重写父类的方法,将 ...
- JAVA基础——设计模式之简单工厂模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...
- 简单工厂模式和策略模式结合使用php
策略模式是有客户端自行实例化算法类的,而简单工厂模客户端只传参数,不关心对象的生成. 结合两种模式,可以在使用策略模式的时候客户端不再生成算法的对象.修改策略模式的配置类即可. 在之前策略模式基础上, ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- [python实现设计模式]-3.简单工厂模式-触宝开放平台
预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- iOS 简单工厂模式
iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
随机推荐
- Ansible--常用模块使用
ansible命令解释 通过ansible命令执⾏的任务称为ad-hoc命令(任务),其实它是相对playbook⽽⾔的.通常,命令⾏⽤来实现ansible的批量管理功能,playbook⽤来实现批量 ...
- spring ApplicationContext中Bean的生命周期
AbstractApplicationContext Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh方法 ...
- 在centos7 上部署 vuepress
vuepress是一款十分优秀简洁的文档生成器,可以根据目录下的md文档自动生成对应的html文件,界面简洁大方.每一个由 VuePress 生成的页面都带有预渲染好的 HTML,也因此具有非常好的加 ...
- 关键字提取算法TF-IDF和TextRank(python3)————实现TF-IDF并jieba中的TF-IDF对比,使用jieba中的实现TextRank
关键词: TF-IDF实现.TextRank.jieba.关键词提取数据来源: 语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据 数据处 ...
- office远程代码执行(CVE-2017-11882)
office远程代码执行(CVE-2017-11882) 影响版本: MicrosoftOffice 2000 MicrosoftOffice 2003 MicrosoftOffice 2007 Se ...
- ubuntu通过apt-get安装JDK8
安装python-software-properties apt-get install python-software-properties apt-get install software-pro ...
- redhat5 安装mysql 5.6
在官网找到下载链接 http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.19-1.rhel5.x86_64.rpm-bundle.tar wg ...
- format 代码
#!/bin/bash#file format.sh#将某个源代码文件中的全角符号转换成半角符号#调用astyle 将某个源代码文件转换成linux风格,缩进方式为4个空格 echo $1#将全角空格 ...
- Linux : Vim 使用与配置 (附 GitHub 自动化配置脚本)
由于经常使用 vim 编辑配置文件,有时候也会进行使用vim 编写一些脚本和c/c++ 程序,所以配置一个常用的 vim 是很是必要的.这篇博文主要是记录vim使用和配置相关的一些知识点. 关于vim ...
- 【PAT】B1082 射击比赛(20 分)
水提水题,直接贴代码啦 #include<cstdio> #include<algorithm> using namespace std; struct ppp{ int id ...