相关概念

什么是继承

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

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

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

类的继承机制

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

为什么要继承机制

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

什么是抽象类

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

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

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

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

抽象类特征

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. AndroidQ 打通应用层到HAL层---(HIDL服务实现)

    什么是HIDL HIDL 全称为HAL interface definition language(发音为"hide-l")是用于指定 HAL 和其用户之间的接口的一种接口描述语言 ...

  2. iOS字符串大小写转换使用小结

    iOS开发中字符串用的比较多,追加,拆分,截取,替换,比较,大小写转换使用的频率还挺高.今天看oc技术书的时候看到关于大小写转换的地方,有一个说的是所有字母首字母大写,还是第一次看到,记录一下,以备后 ...

  3. DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 'function (header, parser) { header = normalizeHeader(header);

    场景:token过期,然后更新了token 重新发起请求获取数据 : 代码:使用上一次的错误请求配置报错     return request(error.config) : 解决 :  return ...

  4. 16. VUE怎么阻止冒泡

    给事件添加 stop 修饰符 ,比如 click.stop  ; 补充: 阻止默认行为 prevent 修饰符 ,超链接的跳转,表单的默认提交 : once 修饰符 事件只触发一次 ps:事件修饰符可 ...

  5. 云原生爱好者周刊:为 DevOps 流水线准备的 macOS 虚拟化工具

    开源项目推荐 Tart Tart 是一个虚拟化工具集,用于构建.运行和管理 Apple Silicon 芯片 macOS 上的虚拟机,主要目的是为 CI 流水线的特殊任务提供运行环境.主要亮点: 使用 ...

  6. 自学PHP笔记(一) PHP语法

    本文转发来自:https://blog.csdn.net/KH_FC/article/details/115407577 PHP基本语法 php使用一对特殊的标记包含php代码,与HTML代码混在一起 ...

  7. Java新特性--方法引用

    常见方法引用 方法引用可以让你重复使用现有的方法定义,并像Lambda一样传递它们. 方法引用可以看做是仅仅调用特定方法的Lambda表达式的一种便捷写法.类似于Lambda表达式,方法引用不能独立存 ...

  8. SpringBoot数据访问,配置数据源

    配置文件目录 配置数据源jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...

  9. K-Means(聚类算法)【转载】

    聚类##### 今天说聚类,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别. 分类其实是从特定的数据中挖掘模式,作出判断的过程.比如Gmail邮 ...

  10. Docker-compose 常用命令和模板

    docker-compose logs -f ##查看该容器的启动的日志打印(日志从头打印 docker logs -f container_id ##查看某一容器的启动的日志打印(日志从头打印) d ...