c#基础学习(0709)之vs通过抽象方法实现多态
抽象类不能用来实例化对象
1、抽象类中可以有实例成员,也可以有抽象成员
2、抽象成员不能有任何实现
3、抽象类、抽象成员必须包含在抽象类中
4、抽象类不能用来实例化对象,既然抽象类不能被实例化,那么抽象类的作用就是用来被继承的,继承的主要目的就是用来实现多态
5、抽象成员子类继承以后必须“重写”,override,除非子类也是个抽象类
namespace 抽象类实现多态案例
{
class Class1
{
static void Main(string[] args)
{
//例子一
Animal animal = new Dog();
animal.Eat();
animal.Bark();
Console.ReadKey(); //例子二
Shape shape = new Rectangle(, );//new Circle(20);
Console.WriteLine("周长:{0}", shape.GetGirth());
Console.WriteLine("面积:{0}",shape.GetArea());
Console.ReadKey();
}
} abstract class Shape
{
public abstract double GetArea();
public abstract double GetGirth();
}
class Circle : Shape
{
public Circle(double r)
{
this.R = r;
}
public double R { get; set; }
public override double GetArea()
{
return Math.PI * this.R * this.R;
}
public override double GetGirth()
{
return * Math.PI * this.R;
}
}
class Rectangle:Shape
{
public Rectangle(double length,double width)
{
this.Length = length;
this.Width = width;
}
public double Length { get; set; }
public double Width { get; set; }
public override double GetArea()
{
return Length * Width;
}
public override double GetGirth()
{
return * (Length + Width);
}
} //======================================== abstract class Animal
{
public abstract void Eat();
public abstract void Bark();
}
class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
public override void Bark()
{
Console.WriteLine("汪汪汪");
}
}
class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("毛吃鱼");
}
public override void Bark()
{
Console.WriteLine("喵喵喵");
}
}
}
什么时候使用抽象类
1、是不是需要被实例化
2、父类中有没有默认的实现
如果不需要被实例化,父类中没有默认的实现,则用抽象类,否则用虚方法来实现
c#基础学习(0709)之vs通过抽象方法实现多态的更多相关文章
- python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- c#基础学习(0706)之使用虚方法实现多态
使用虚方法实现多态 namespace _0706 { class Program { static void Main(string[] args) { //这个时候调用的是父类的方法 Person ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java基础学习(2)
Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...
- java基础学习笔记五(抽象类)
java基础学习总结——抽象类 抽象类介绍
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
随机推荐
- python 返回数组的索引
使用python里的index nums = [1, 2, 3, 4, 5, 6, 1, 9] print nums.index(max(nums)) print nums.index(1) 该方法同 ...
- MySQL(分组、连表操作、备份数据库)
day58 分组 参考:https://www.cnblogs.com/xp796/p/5262187.html select dept, max(salary) from department gr ...
- mybatis源码追踪1——Mapper方法用法解析
Mapper中的方法执行时会构造为org.apache.ibatis.binding.MapperMethod$MethodSignature对象,从该类源码中可以了解如何使用Mapper方法. [支 ...
- JVM中的对象生命周期
在JVM运行空间中,对象的整个生命周期大致可以分为七个阶段:创建阶段(Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段( Unreachable).可收集阶段 ...
- Swinject 源码框架(二):循环依赖的解决
可能存在循环依赖,比如 Parent 强制有 Child, Child 弱持有 Parent. 具体实现如下.Parent 初始化时,必须传入 Child,而 Child 初始化不必传入 Parent ...
- Visual Studio和eclipse的大小写转换快捷键
Visual Studio: 转小写:ctrl + u 转大写: ctrl + shift + u eclipse: 转小写: ctrl + shift + y 转大写: ctrl + shif ...
- Maven私服架设(nexus / on windows)
Maven私服可以用多个不同的产品可供选择,下面我们演示使用最为广泛的nexus来架设maven本地私服 Nexus的下载及安装请见官方下载页: http://www.sonatype.org/n ...
- express中间件原理 && 实现
一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = re ...
- 再学Java 之 形参个数可变函数
自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variab ...
- 【Canal源码分析】Canal Server的启动和停止过程
本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...