【C#】【平时作业】习题-7-继承、抽象与多态
相关概念
什么是继承
继承定义了如何根据现有类创先新类的过程
任何类都可以从另外一个类继承
一个派生出来的子类具有这个类的所有公共属性和方法
类的继承机制
创建新类所根据的基础类称为基类或父类,新建的类称为派生类或子类
为什么要继承机制
继承是实现代码重用的重要机制。使用继承可以不需要从头开始创建新类,可以在现有的基础上添加新的方法和属性,节约时间和精力,大大提高效率。
什么是抽象类
不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们
的实例(抽象类,不能被初始化,不能被实例化)
用法:一个抽象类只能通过接口和作为其它类的基类使用
一个抽象类必须为所有的接口成员提供实现;一个用于实现接口的抽象类可能把接口方法安排到抽象方法上
抽象类特征
1.抽象类不能被实例化。
2.抽象类可以包含抽象方法和访问器
3.不能把抽象类用密封(sealed)来修饰,那就意味着类不能被继承,这违反抽象类被继承的原则。
4.一个派生于一个抽象类的非抽象类必须包括所有的继承来的抽象方法和访问器的实现
5.在方法和属性中使用abstract 关键字意味着包含它们的实现。
什么是抽象成员
1.必须是函数成员,而不能是字段和常量。
- 使用abstract修饰。
- 不能有实现代码块,以分号替代。
- 抽象成员只能在抽象类中声明。
- 抽象成员类型:方法、属性、事件、索引器。
抽象方法的特征
1.一个抽象方法可以看作是一个虚函数。
2.抽象方法的声明只能在抽象类中。
3.因为抽象方法声明只提供一个无实现的方式,没有方法体
4.方法体的实现被覆写方法提供,覆写方法是一个非抽象类的成员。
5.抽象属性的行为和抽象方法相像,除了不同的声明形式。
6.在一个静态属性中使用abstract 是一个错误。
abstract与virtual对比
- 相同点:都有相同的成员类型,方法、属性、事件和索引器。
- 不同点:
- 修饰符不同;
- 虚方法有实现体,抽象成员没有实现体;
- 在派生类中、虚成员能被覆写,但不是必须的,而抽象成员必须被覆写。
注意事项
抽象属性和抽象方法必须是共有的(public)
子类继承抽象类,需要override抽象类中的抽象属性和抽象方法,如果有未override的,则子类也必须为抽象类
一个抽象类可以包含抽象和非抽象方法,当一个类继承于抽象类,那么这个派生类必须实现所有的基类抽象方法
抽象类的部分实现:通过声明派生类也为抽象,可以避免所有或特定的虚方法的实现
一个抽象类能够继承另一个非抽象类。继承了基类的方法,添加新的抽象和非抽象方法是可行的
什么是多态
同一操作,作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性
方法重载与多态的区别与联系
在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态 体现在 重载 和 重写 上
重载是在同一个类中有多个同名不同参数的方法;
重写是在继承类中有与基类同名同参的方法
重载是指具有相同的函数名词,但是参数类型,个数(必须的)与返回值(不是必须的)不相同。

编程题
已知形状类如下:
/// <summary>
/// 形状类
/// </summary>
public abstract class Shape
{
/// <summary>
/// 计算面积
/// </summary>
/// <returns>int</returns>
public abstract int ComputeArea();
/// <summary>
/// 计算体积
/// </summary>
/// <returns>int</returns>
public abstract int ComputeVolume();
public int volume;
public const double PI = 3.1415926;
}
1. 设计并实现长方体类,该类的具体的功能如下:
从形状类(Shape)派生;
计算长方体的体积;
计算长方体的表面积;
具有构造函数,可在创建长方体对象时,指定长方体的特征;
长方体的特征包括int 长、int 宽、 int高;
长方体的长宽高均不超过50;
2. 设计并实现圆锥类,该类的具体的功能如下:
从形状类(Shape)派生;
计算圆锥体的体积;
计算圆锥体的表面积;
具有构造函数,可在创建圆锥体对象时,指定圆锥体的特征;
长方体的特征包括int 半径、int 高;
长方体的半径和高均不超过50;
解答
创建形状类
根据上面的题目,首先创建形状类Shape.cs


public abstract class Shape
{
public int volume;
public const double PI = 3.1415926;
/// <summary>
/// 计算面积
/// </summary>
/// <returns>int</returns>
public abstract int ComputeArea();
/// <summary>
/// 计算体积
/// </summary>
/// <returns>int</returns>
public abstract int ComputeVolume();
}
创建长方体类
Cuboid.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp02_长方体与圆锥类
{
class Cuboid : Shape //继承抽象类
{
//字段
private int _length;
private int _width;
private int _height;
//属性
public int Length{ get => _length; set => value = value > 50 || value <= 0 ? 50 : value; }
public int Width { get => _width;set=>value=value>50|| value <= 0 ? 50 : value; }
public int Height { get => _height; set => value = value > 50 || value <= 0 ? 50 : value; }
//构造函数
public Cuboid(){}
//构造函数-重载
public Cuboid(int length,int width,int height )
{
Length = length;
Height = height;
Width = width;
}
//实现抽象方法
/// <summary>
/// 计算长方体表面积
/// </summary>
/// <returns>int型 返回长方体表面积</returns>
public override int ComputeArea()
{
return (Height * Width + Width * Length + Height * Length) * 2;
}
/// <summary>
/// 计算长方体体积
/// </summary>
/// <returns>int型 返回长方体体积/returns>
public override int ComputeVolume()
{
return Height * Width * Length;
}
}
}
创建圆锥体类
Cone.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp02_长方体与圆锥类
{
class Cone:Shape //继承抽象类
{
//字段
private int _radius;
private int _height;
//属性
public int Radius { get => _radius; set => value = value <= 0 || value > 50 ? 50 : value; }
public int Height { get => _height; set => value = value <= 0 || value > 50 ? 50 : value; }
//构造函数
public Cone() { }
//构造函数-重载
public Cone(int radius, int height) {
Radius = radius;
Height = height;
}
//实现抽象方法
/// <summary>
/// 计算圆锥表面积
/// </summary>
/// <returns>int型,圆锥表面积计算结果</returns>
public override int ComputeArea()
{
return Convert.ToInt32(PI * Radius * Radius + PI * Radius * Math.Sqrt(Height*Height+Radius*Radius));
}
/// <summary>
/// 计算圆锥体积
/// </summary>
/// <returns>int型,圆锥体积计算结果</returns>
public override int ComputeVolume()
{
return Convert.ToInt32((PI * Radius * Radius * Height) / 3);
}
}
}
【C#】【平时作业】习题-7-继承、抽象与多态的更多相关文章
- 七:Java之封装、抽象、多态和继承
本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...
- 1-JAVA类、接口、抽象、多态
类中全部成员变量用priviate修饰,用get获取,set设值 对于boolean类型的值,getter方法也一定要写成isXXX 的形式,而setXXX类型不变 this关键字的作用 当方法的局部 ...
- 利用抽象、多态实现无反射的绿色环保ORM框架
最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...
- Java—继承、封装、抽象、多态
类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...
- (C/C++学习)5.C++中的虚继承-虚函数-多态解析
说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...
- [Objective-C] 004_继承封装与多态
继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的 ...
- Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...
- Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态
一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- java中静态属性和和静态方法的继承问题 以及多态的实质
首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...
随机推荐
- Laravel视图共享数据
Laravel视图共享数据 最近在用lavavel过程中想实现公共头部尾部需要的配置数据在所有的页面中都可以使用,便查看了官方文档,在此做一个总结: 一. 修改 ComposerServiceProv ...
- android IO Prefetch源码分析
I/O Prefetcher是高通本身提供的一套优化方案,可以用在Android手机App冷启动的时候.本文基于android Q 主要分libqti-iopd.vendor.qti.hardware ...
- C++第六节课 引用变量 指针的升级版
#include <iostream> using namespace std; // C++的引用 是C指针的升级 可以提高代码的稳定性和健壮性 // const 修饰的引用 是 常引用 ...
- docker安装过程 - 下载mysql
1. 下载必要的包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2. 指定虚拟机去哪里安装 docker sudo ...
- Vue 项目优化解决方案 有哪些 ?
1. 打包的时候 , 通过插件把css代码单独抽离出来使用 link 引入 2. 打包的时候 , 通过webpack内置插件optimization 把 公共的js代码抽离出来 ps:打包之后,代码 ...
- 使用svn保存markdown文档
使用svn管理md文档时,使用谷歌直接访问出现中文乱码,解析格式错误的问题,可以通过安装谷歌浏览器的插件解决. 一.解决格式解析错误的问题 安装插件 Markdown Preview Plus ,安装 ...
- Web渗透03_扫描技术
前言 在获取目标主机的各类信息时,有一些综合工具可以一键扫描完成,大大方便了测试效率.但扫描结果并非100%的正确,需要我们的判断. namp NMAP(Network Mapper)是一款开放源代码 ...
- Power BI如何连接MySQL数据库
既然写了如何卸载MySQL connector net(相关文章见如何解决MySQL Connector NET xxxx无法卸载的问题(win10)),那就顺便再写一篇Power BI(以下简称PB ...
- Java常见面试真题之中级进阶
前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!java反射的作用于原理?说说List,Set,Map三者的区别?Object 有哪些常用方法?大致说一下每个方法的含义?Java 创建对 ...
- 5.2 Vi和Vim之间到底有什么关系?
我们知道,Vi 编辑器是 Unix 系统最初的编辑器.它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行.在文件中移动.插入.编辑和替换文本. 尽管 Vi 可能是世界上复杂的编辑器(讨厌它的人 ...