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 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
随机推荐
- 教你如何使用云服务器去搭建SS
注册云服务器 (首先推荐Vultr,注册链接:https://www.vultr.com/?ref=6962741,其他云服务商如阿里云HK,Linode等亦可使用,按需选择) 这里拿Vultr举例: ...
- LinkedHashMap
LinkedHashMap既是一个HashMap,也是一个链表 package java.util; import java.util.function.Consumer; import java.u ...
- Linux笔记(二): WIN 10 Ubuntu 双系统
(一) 说明 记录一次ubuntu安装过程及遇到的问题. 环境:WIN 10 单硬盘 (二) ubuntu ISO文件下载 ubuntu 18.04 https://www.ubuntu.com/ ...
- 服务器 nginx配置 防止其他域名绑定自己的服务器
基于我的网站被其他的域名恶意绑定了,我做出了如下处理,全站转https,同时配置nginx跳转禁止其他绑定ip的域名访问(原理主机空域名可绑定任意的,参考https://www.jb51.net/ar ...
- tkinter中combobox下拉选择控件(九)
combobox控件,下拉菜单控件 combobox控件在tkinter中的ttk下 简单的实现下: import tkinter from tkinter import ttk # 导入ttk模块, ...
- 洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍
decimal 1.作用: 用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于 金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度, ...
- SQL Server 2000详细安装过程及配置
说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,虽然现如今SQL Server 2000软件早已经过时了,但仍然有一部分人在使用它,尤 ...
- Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用
Jenkins的配置从节点中默认没有Launch agent via Java Web Start,如下图所示,而这种启动方式在Windows上是最方便的. 如何设置才能让出来呢? 1:打开" ...
- ARP单播请求?
在我的理解中,ARP请求是已知对方的IP地址,想要请求对方的MAC地址,用以封装以太网帧头.因此在不知道对方MAC地址的情况下,会广播ARP请求到整个子网,让子网中的所有设备收到这个广播ARP请求报文 ...
- Centos7.5调试/etc/sysctl.conf文件导致宕机
今天安装greenplus数据库,需要调试一个核心文件/etc/sysctl.conf文件,结果导致系统异常宕机,出现的问题就是使用任何命令都不能输出正确的结果,只有这个显示: 不知道是什么原因,ls ...