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 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
随机推荐
- 测试思想-测试设计 史上最详细测试用例设计实践总结 Part2
史上最详细测试用例设计实践总结 by:授客 QQ:1033553122 -------------------------接 Part1-------------------------- 方法:这里 ...
- springboot 学习之路 20 (整合RabbitMQ)
整合RabbitMQ: 我的操作系统是window7 ,所以在整合ribbotMQ之前需要先安装rabbitMq服务:安装步骤请参考:window下安装RabbitMQ 这个详细介绍了安装步骤,请按 ...
- 3.网络编程-tcp的服务器简单实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/1/13 22:03 # @Author : ChenAdong # @ema ...
- C#检测U盘是否插入
public partial class Form1 : Form { #region u盘属性 public const int WM_DEVICECHANGE = 0x219;//U盘插入后,OS ...
- 第五章 绘图基础(SINEWAVE)
//SINEWAVE.C -- Sine Wave Using Polyline (c) Charles Petzold, 1998 #include <Windows.h> #inclu ...
- PCA与KPCA
PCA是利用特征的协方差矩阵判断变量间的方差一致性,寻找出变量之间的最佳的线性组合,来代替特征,从而达到降维的目的,但从其定义和计算方式中就可以看出,这是一种线性降维的方法,如果特征之间的关系是非线性 ...
- Vs .Net Framework 灵活配置
背景:我们开发和部署项目时都是通过注释某些配置项 比如: 在调试时就注释掉生产的配置项,在生产时又要改回来,只有一个还好,如果多的话就会非常容易出错. 问题1:在发布时容易出错,需要控制发布时根据配置 ...
- 用python写个简单的小程序,编译成exe跑在win10上
每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...
- postgresql中uuid的使用
本文总共介绍两种方法 : 1.使用create extension命令 create extension "uuid-ossp" 安装扩展成功以后,就可以通过uuid_genera ...
- js常见错误类型
(1)SyntaxError SyntaxError是解析代码时发生的语法错误 // 变量名错误 var 1a; // 缺少括号 console.log 'hello'); (2)ReferenceE ...