C#多态的三种实现方式(小结)
作者:令狐掌门 发布时间:2022-12-29 18:10:57
标签:C#,多态
C#实现多态主要有3种方法,虚方法,抽象类,接口
1 虚方法
在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上override关键字,例如下面的Person类的SayHello方法
class Person
{
public Person(string name)
{
this.Name = name;
}
string _name;
public string Name { get => _name; set => _name = value; }
//父类方法加virtual,子类用override重写该方法,就实现了多态
public virtual void SayHello()
{
Console.WriteLine("我是父类的方法");
}
}
学生类和教师都继承于Person
class Student : Person
{
public Student(string name) : base(name) { }
public override void SayHello()
{
Console.WriteLine("我叫{0}, 我是学生", this.Name);
}
}
class Teacher:Person
{
public Teacher(string name) : base(name) { }
public override void SayHello()
{
Console.WriteLine("我叫{0}, 我是老师", this.Name);
}
}
然后在Main函数中使用多态
Student st = new Student("李雷");
Teacher th = new Teacher("井边君");
Person[] p = { st, th }; //子类对象赋给父类
for(int i = 0; i < p.Length; i++)
{
p[i].SayHello();
}
Console.ReadKey();
本例全部代码
using System;
namespace 多态之虚方法
{
class Program
{
static void Main(string[] args)
{
Student st = new Student("李雷");
Teacher th = new Teacher("井边君");
Person[] p = { st, th }; //子类对象赋给父类
for(int i = 0; i < p.Length; i++)
{
p[i].SayHello();
}
Console.ReadKey();
}
}
class Person
{
public Person(string name)
{
this.Name = name;
}
string _name;
public string Name { get => _name; set => _name = value; }
//父类方法加virtual,子类用override重写该方法,就实现了多态
public virtual void SayHello()
{
Console.WriteLine("我是父类的方法");
}
}
class Student : Person
{
public Student(string name) : base(name) { }
public override void SayHello()
{
Console.WriteLine("我叫{0}, 我是学生", this.Name);
}
}
class Teacher:Person
{
public Teacher(string name) : base(name) { }
public override void SayHello()
{
Console.WriteLine("我叫{0}, 我是老师", this.Name);
}
}
}
2 抽象类
在类前面加关键字abstract,方法前面加abstract,抽象方法不能有函数体。
抽象类的特点:
(1)可以有字段
(2)可以有非抽象方法
抽象类实现多态的代码如下
using System;
using System.Collections.Generic;
namespace 多态之抽象类
{
abstract class Person
{
//抽象方法不能有函数体
public abstract void SayHello();
}
class Student : Person
{
public override void SayHello()
{
Console.WriteLine("我是子类Student重写的抽象方法"); ;
}
}
class Teacher : Person
{
public override void SayHello()
{
Console.WriteLine("我是子类Teacher重写的抽象方法"); ;
}
}
class Program
{
static void Main(string[] args)
{
List<Person> clist = new List<Person>();
Student st = new Student();
Teacher th = new Teacher();
clist.Add(st);
clist.Add(th);
foreach(Person p in clist)
{
p.SayHello();
}
Console.ReadKey();
}
}
}
3 接口实现多态
代码如下
using System;
using System.Collections.Generic;
namespace 多态之接口
{
public interface IWeapon
{
void Fire();
}
class Gun : IWeapon
{
public void Fire()
{
Console.WriteLine("我是枪");
}
}
class Sword : IWeapon
{
public void Fire()
{
Console.WriteLine("我是剑");
}
}
class Tank : IWeapon
{
public void Fire()
{
Console.WriteLine("我是坦克");
}
}
class Program
{
static void Main(string[] args)
{
List<IWeapon> list = new List<IWeapon>();
Gun gun = new Gun();
Sword sw = new Sword();
Tank ta = new Tank();
list.Add(gun);
list.Add(sw);
list.Add(ta);
foreach (IWeapon p in list)
{
p.Fire();
}
Console.ReadKey();
}
}
}
接口的特点
(1)接口里的方法不能有修饰符,默认是public
(2)接口的方法不能有函数体
(3)接口中不能包含示例字段,不能有构造函数
(4)接口里的方法被继承的类重写时,不需要用override关键字,接口不能被实例化
(5)接口之间可以继承,并且可以多继承;接口不能继承于类,但是类可以继承于接口
(6)一个类可以同时继承一个类,并实现多个接口
来源:https://blog.csdn.net/yao_hou/article/details/113822624


猜你喜欢
- 你是否受够了每次修改静态文件都要重启服务器?有时候在一些公司前后端的职责没有那么的明确,往往后台人员也要去写一些页面,像jsp页面,或者其他
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 本文实例讲述了DevExpress设置饼状图的Lable位置的方法。分享给大家供大家参考。具体实现方法如下:关键代码如下:/// <s
- 两种基本的输入方式1.使用Scanner类需要java.util包构造Scanner类的对象,附属于标准输入流System.in,之后通过其
- 本文实例为大家分享了C#通过NPOI导入导出数据EXCEL的具体代码,供大家参考,具体内容如下其实从数据库到服务器导入导出有很多方法,但是比
- ❤️大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!❤️先来看一下线程这张图线程的几种运行状态之间运行流程:看不懂没关系,慢慢来学习,往
- 1.Quartz是什么?Quartz是一个开源的Java调度框架,可以用来实现在指定的时间或时间间隔触发任务执行的功能。它支持多种方式的作业
- 一、问题背景在Intellij idea中,新建Maven项目,在魔项目中新建多个模块,发现模块间相互调用失败二、问题原因模块间无法相互引用
- DeferredResult的超时处理,采用委托机制,也就是在实例DeferredResult时给予一个超时时长(毫秒),同时在onTime
- 1:@Qualifier@Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了。所以@Auto
- 初始化sp 内部将数据放到 xml 文件中,加载时首先会将硬盘中文件读取到内存中,这样加快了访问速度这次从源码开始,看看里面具体做了什么//
- 之前学习了设计模式原型模式,在原型模式中就提到了对象的深拷贝。深拷贝指的是拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一
- 废话不多说了,直接给大家贴代码了,具体代码如下所述:package com.example.esp8266;import java.io.I
- java模拟实现图书检索系统 (基础版),供大家参考,具体内容如下练习实现3个简单的功能,没有优化,可以根据需求,自行添加想要实现的功能。B
- 一、依赖注入方式思考:向一个类中传递数据的方式有几种?普通方法(set方法)构造方法思考:依赖注入描述了在容器中建立bean与bean之间依
- 本文实例讲述了Android编程设计模式之原型模式。分享给大家供大家参考,具体如下:一、介绍原型模式是一个创建型的模式。原型二字表明了该模型
- 实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询、长连接+长轮询、基于第三方插件(如FLASH的Socket
- 这是一个高级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。接下来
- JFormDesigner概述jformdesigner是一款功能强大的Swing设计工具,这是全面的程序,可帮助您创建Swing GUI,
- 概述Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,