多态,不同对象对同一方法的不同实现

使用abstract关键字表示抽象类

 // 表示是一个抽象类
public abstract class Animal
{
private string name;
private double weight;
}

抽象类

// 表示是一个抽象类
public abstract class Animal
{
private string name;
private double weight; public string Name { get => name; set => name = value; }
public double Weight { get => weight; set => weight = value; } public Animal() { }
public Animal(string _name,double _weight)
{
this.Name = _name;
this.Weight = _weight;
}
}

抽象类不能被实例化

public class Dog:Animal
{
}

Dog类继承抽象类Animal后可以实例化

static void Main(string[] args)
{ Dog d = new Dog();
d.Name = "Dog";
d.Weight = 10;
}

抽象类中的抽象方法

1.方法就没有主体,只有定义

2.子类在继承抽象类时,必须实现抽象类中的抽象方法

3.使用override进行重写

Animal中ShowInfo是抽象方法

// 表示是一个抽象类
public abstract class Animal
{
// 省略··· public void Show()
{
Console.WriteLine("名字:{0},体重:{1}",this.Name,this.Weight);
}
// 如果一个方法声明为abstract抽象方法,方法就没有主体,只有定义
// 继承这个抽象类的所有子类都要实现这个方法
public abstract void ShowInfo();
}

Dog中使用override重写

public class Dog:Animal
{
// 子类在继承抽象类时,必须实现抽象类中的抽象方法
// 使用override进行重写
public override void ShowInfo()
{
Console.WriteLine("这是子类重写父类的抽象方法");
}
}

实现效果如下:

static void Main(string[] args)
{
Dog d = new Dog();
d.Name = "Dog";
d.Weight = 10;
d.Show();
d.ShowInfo();
}

多态定义:不同对象对同一方法做出不同的实现

Animal是一个抽象类

// 表示是一个抽象类
public abstract class Animal
{
// 省略···
// 抽象类的抽象方法ShowInfo()
public abstract void ShowInfo();
}

Dog中使用override重写继承Animal

public class Dog:Animal
{
public override void ShowInfo()
{
Console.WriteLine("这是Dog重写Animal的抽象方法");
}
}

新建Pig类继承Animal

public class Pig:Animal
{
public override void ShowInfo()
{
Console.WriteLine("Pig对Animal的抽象方法实现");
}
}

抽象类中父类可以通过子类实现

实现效果如下:

static void Main(string[] args)
{
// 多态定义:不同对象对同一方法做出不同的实现
// 抽象类不能直接被实例化
// 抽象类的父类指向子类,具体实现可以由子类实现
Animal d = new Dog(); // 父类指向Dog类
d.ShowInfo();
d = new Pig(); // 父类指向Pig类
d.ShowInfo();
}

效果如下:

接口

应用:为了实现跨行转账业务,定义了一个接口,该接口包含了一个用于存取款的方法和一个返回余额的属性

接口只能对方法定义

抽象类和接口的区别:抽象类有字段和属性,接口没有

抽象类只能单一继承,接口可以多个继承

IBank接口

using System;
using System.Collections.Generic;
using System.Text; namespace ConsoleApp6
{
// 接口只是对于方法定义
// 抽象类和接口的区别:抽象类有字段和属性,接口没有
// 抽象类只能单一继承,接口可以多个继承
interface IBank
{ // 定义了一个接口,只有接口定义,没有方法实现
// 它是特殊的抽象方法,没有abstract关键字
// 子接口实现也不需要像抽象方法一样用override
void Zhuan(double dzhuan);
}
}

IUser接口

namespace ConsoleApp6
{
interface IUser
{
}
}

对接口的继承使用

// 银行卡
// 可以继承多个接口
class UserCard:IBank,IUser
{
public void Zhuan(double dZhuan)
{
// 继承了接口函数
}
}

最新文章

  1. OneThink-nav标签
  2. DB2 JDBC
  3. Lucene.net 实现近实时搜索(NRT)和增量索引
  4. GRID方式ALV导出数据到本地丢掉最后一位的问题
  5. 移动端的头部标签和meta
  6. awk文本处理知识汇总
  7. ARM Cortex-M instructions
  8. POJ-3294-Life Forms(后缀数组-不小于 k 个字符串中的最长子串)
  9. java基础知识再学习--maven
  10. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现
  11. Arcgis for javascript map操作addLayer具体解释
  12. 《深入理解Java虚拟机》——垃圾收集器与内存分配策略
  13. android 线程那点事
  14. js实现浏览器调用电脑的摄像头拍照
  15. Django项目中自定义manage命令
  16. java开发前的配置
  17. Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)
  18. uva-387-暴力枚举
  19. HTML 样式兼容不同设备类型
  20. Google I/O 2018大会小结

热门文章

  1. pat1068. Find More Coins (30)
  2. 使用cookie的注意事项
  3. GitKraken使用教程-基础部分(8)
  4. Linux mysql 基础操作
  5. canvas的isPoinInPath API实现交互
  6. jQuery核心探究
  7. Javascript基础--数据类型
  8. python网络编程-socketserver模块
  9. selnium截屏操作
  10. 5步玩转Power BI Embedded,老司机全程带路解析