相关概念

什么是继承

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

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

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

类的继承机制

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

为什么要继承机制

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

什么是抽象类

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

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

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

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

抽象类特征

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. 统一携带 token

    tokne 可以使用 vuex 和 本地存储处理 : 一些接口需要携带token为了避免代码的重复性,可以在请求拦截器统一加入token ,每次请求都会携带token参数,不需要token参数的接口也 ...

  2. 怎么封装一个vue的自定义指令

    自定义指令分为 全局和局部的指令 : 1. 自定义全局指令: 在 mian.js 中 ,使用 Vue.directive('指令名' ,  配置对象 ) 2. 局部自定义指令 在组件中使用 direc ...

  3. dp线段树优化

    题目:Potted Flower Description The little cat takes over the management of a new park. There is a larg ...

  4. jmeter测试rpc接口-使用dubbo框架调用

    1.下载用于测试dubbo的spring boot项目 参考文章: http://t.zoukankan.com/111testing-p-11297038.html https://zhuanlan ...

  5. springBoot项目启动卡在Root WebApplicationContext: initialization completed... (非DEBUG断点问题)

    通过源码启动排查发现,初始化连接池时创建了200次,通过配置文件中将initialSize值改为10,启动时间从1分钟变为了3秒.

  6. IntelliJ IDEA 设置背景图片 随机快捷更换背景图片(附高清4K背景图N张)

    前言 开发过程枯燥乏味,何不为自己工作中添加点乐子呢,除了主题模板,我们可以设置IntelliJ IDEA 的背景图片,换个背景图,换个心情. IntelliJ IDEA 设置背景图片 注意: 必要的 ...

  7. rce临时文件上传[RCE1]P8

    rce临时文件上传[RCE1]P8 /[A-Za-z0-9!~^|&]+/i 匹配了我能想到的所有绕过方法,想到临时文件上传,是否可以执行/tmp/?????????这个文件呢 /tmp/?? ...

  8. git cherry-pick 同事代码commit后 如何修改为自己的author

    如果有个功能是同事在做,但是做到一半,需要接手帮忙修改或者完成后续,可以切入他的分支 git checkout 分支名称 直接开发,也可以 git checkout -b 新分支名称 这样就完全拥有他 ...

  9. nvidia公司的机器人仿真环境的历史发展介绍(Isaac-Gym、Isaac-Sim)

    相关: NVIDIA机器人仿真项目 -- Isaac Gym - Preview Release 本文说下NVIDIA公司的机器人仿真项目的一些历史发展. NVIDIA公司的产品最初只有显卡,但是卖着 ...

  10. celery报错笔记

    报错: Invalid value for '-P' / '--pool' Invalid value for '-P' / '--pool': <class 'celery.concurren ...