相关概念

什么是继承

继承定义了如何根据现有类创先新类的过程

任何类都可以从另外一个类继承

一个派生出来的子类具有这个类的所有公共属性和方法

类的继承机制

创建新类所根据的基础类称为基类或父类,新建的类称为派生类或子类

为什么要继承机制

继承是实现代码重用的重要机制。使用继承可以不需要从头开始创建新类,可以在现有的基础上添加新的方法和属性,节约时间和精力,大大提高效率。

什么是抽象类

不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们

的实例(抽象类,不能被初始化,不能被实例化)

用法:一个抽象类只能通过接口和作为其它类的基类使用

一个抽象类必须为所有的接口成员提供实现;一个用于实现接口的抽象类可能把接口方法安排到抽象方法上

抽象类特征

1.抽象类不能被实例化。

2.抽象类可以包含抽象方法和访问器

3.不能把抽象类用密封(sealed)来修饰,那就意味着类不能被继承,这违反抽象类被继承的原则。

4.一个派生于一个抽象类的非抽象类必须包括所有的继承来的抽象方法和访问器的实现

5.在方法和属性中使用abstract 关键字意味着包含它们的实现。

什么是抽象成员

1.必须是函数成员,而不能是字段和常量。

  1. 使用abstract修饰。
  2. 不能有实现代码块,以分号替代。
  3. 抽象成员只能在抽象类中声明。
  4. 抽象成员类型:方法、属性、事件、索引器。

抽象方法的特征

1.一个抽象方法可以看作是一个虚函数。

2.抽象方法的声明只能在抽象类中。

3.因为抽象方法声明只提供一个无实现的方式,没有方法体

4.方法体的实现被覆写方法提供,覆写方法是一个非抽象类的成员。

5.抽象属性的行为和抽象方法相像,除了不同的声明形式。

6.在一个静态属性中使用abstract 是一个错误。

abstract与virtual对比

  • 相同点:都有相同的成员类型,方法、属性、事件和索引器。
  • 不同点:
    1. 修饰符不同;
    2. 虚方法有实现体,抽象成员没有实现体;
    3. 在派生类中、虚成员能被覆写,但不是必须的,而抽象成员必须被覆写。

注意事项

抽象属性和抽象方法必须是共有的(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-继承、抽象与多态的更多相关文章

  1. 七:Java之封装、抽象、多态和继承

    本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...

  2. 1-JAVA类、接口、抽象、多态

    类中全部成员变量用priviate修饰,用get获取,set设值 对于boolean类型的值,getter方法也一定要写成isXXX 的形式,而setXXX类型不变 this关键字的作用 当方法的局部 ...

  3. 利用抽象、多态实现无反射的绿色环保ORM框架

    最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...

  4. Java—继承、封装、抽象、多态

    类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...

  5. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  6. (C/C++学习)5.C++中的虚继承-虚函数-多态解析

    说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...

  7. [Objective-C] 004_继承封装与多态

    继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的 ...

  8. Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态

    python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...

  9. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  10. java中静态属性和和静态方法的继承问题 以及多态的实质

    首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...

随机推荐

  1. 2022年11月中国数据库排行榜:GaussDB获认证进前五,GBase得融资竞逐鹿

    击石乃有火,不击元无烟. 2022年11月的 墨天轮中国数据库流行度排行榜 火热出炉,本月共有246个数据库参与排名,相比上月新增1个数据库.由于国庆节长假,数据库整体热度指数有所降低,所以出现了多数 ...

  2. 2022年2月国产数据库排行榜: OceanBase“三连增”重夺探花,GaussDB实现本月最大涨幅引期待

    寒辞去冬雪,暖带入春风.2022年2月,虎年开年的国产数据库流行度排行榜已在墨天轮社区发布,本月共有195个数据库参与排名.排名前十位的数据库分数增减幅度较大,整体排名略有波动. 首先,我们来看看排行 ...

  3. 复用对评论和对文章回复的弹层 popup- vant2

    基本样式: ps:当message 即输入的内容的长度为 0 的时候,按钮禁止使用 : <template> <div class="comment-post"& ...

  4. 55.父页面通过ifaram嵌套子页面,如何固定子页面菜单

    使用固定定位 :

  5. 15 Transformer 框架概述

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  6. day17-打印三角形及Debug

    打印三角形 之前学习C++的时候也曾做过,于是乎凭借记忆又试了试,也还能试出来.代码如下:  #include<stdio.h> int main(){  int i,j;  for(i= ...

  7. 更改后端的数据格式适配el-tree组织树

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  8. 关于uniapp的兼容性的一些问题

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  9. 痞子衡嵌入式:瑞萨RA系列FSP固件库分析之外设驱动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是瑞萨RA系列FSP固件库里的外设驱动. 上一篇文章 <瑞萨RA8系列高性能MCU开发初体验>,痞子衡带大家快速体验了一下瑞萨 ...

  10. 2024Ciscn总决赛Web Writeup

    前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require('express') ...