C# 面向对象补全计划 两步分清抽象类和接口

news/2024/10/21 3:43:05/

C# & Unity 面向对象补全计划 之 接口_unity c# 接口-CSDN博客

这一篇文章泛泛概述了抽象类与接口,但是他俩都是用作强制继承的,却没有进行系统性地整理实在不合适

今天我就一步到位,两步分清他俩该在什么场景调用

一看构造函数 知特征

        记住,结构体和类的本质特征是拥有构造函数

抽象类有构造函数

字段:也是因为这个,所以抽象类可以有字段

属性:至于属性,这是.net引入的语法糖所以在类和接口中拥有

方法:抽象方法没有方法体,必须写在抽象类中且强制重写

当然抽象类可以包含非抽象方法

// 定义一个抽象类
public abstract class Animal
{public abstract string Name { get; set; }public abstract string Kind { get; set; }public abstract string Habit { get; set; }public abstract void DescribeSelf();
}// 继承抽象类并实现抽象方法
public class Cat : Animal
{public override string Name { get; set; } = "猫";public override string Kind { get; set; } = "猫科类";public override string Habit { get; set; } = "逮老鼠";public override void DescribeSelf(){Console.WriteLine($"当前动物\n名称:{Name}\n种类:{Kind}\n习性:{Habit}");}
}

接口没有构造函数 

字段:没有构造函数,所以他就不是类,所以其不能包含字段

属性:同上,语法糖通用

方法:开始是没有方法体的,但是c# 8.0以后就可以有了,叫做默认接口方法,用不用看自己的需求

// 定义一个接口
public interface IShopping
{string ShoppingName { get; set; }void ShoppingCount();
}// 实现接口
public class Shopper : IShopping
{public string ShoppingName { get; set; } = "衣服";public void ShoppingCount(){Console.WriteLine($"我购买了100件: {ShoppingName}");}
}

二看继承数 识用途

抽象类是类,所以只能被单继承(c#

        正是因为单继承,所以,抽象类天生适合定义所有具有基础属性的祖宗,且因为继承的传递性,可以传递下去

// 定义动物抽象类
public abstract class Animal
{public abstract void MakeSound();
}// 定义猴类,继承动物抽象类并实现抽象方法
public class Monkey : Animal
{public override void MakeSound(){Console.WriteLine("Monkey makes sound.");}public void Climb(){Console.WriteLine("Monkey can climb.");}
}// 定义人类,继承猴类
public class Human : Monkey
{public void Speak(){Console.WriteLine("Human can speak.");}
}

类可以继承多个接口

        正是因为多继承,所以,接口天生适合定义数量很多的行为

public interface IFlyable
{void Fly();
}public interface ISwimmable
{void Swim();
}public interface IAquaticBird : IFlyable, ISwimmable
{void DisplayAbilities();
}public class Duck : IAquaticBird
{public void Fly(){Console.WriteLine("Duck is flying.");}public void Swim(){Console.WriteLine("Duck is swimming.");}public void DisplayAbilities(){Console.WriteLine("Duck can both fly and swim.");}
}

最后,抽象类可以继承接口

// 定义一个接口
public interface IAnimal
{void MakeSound();
}// 定义一个抽象类,实现接口
public abstract class Mammal : IAnimal
{public abstract void MakeSound(); // 抽象类没有实现接口方法public void Breathe(){Console.WriteLine("Mammal is breathing.");}
}// 定义一个具体类,继承抽象类
public class Human : Mammal
{public override void MakeSound(){Console.WriteLine("Human says hello.");}
}


 


http://www.ppmy.cn/news/1538310.html

相关文章

uniapp 如何引用icon 字体

平时使用阿里巴巴的iconfont字体需要下载字体到本地或通过网址引入字体才能使用,但有些情况可能不允许这么做,例如小程序与平常web开发中引入字体图标的方式不一样,必须先转为base64再引入,以下介绍iconfont字体转base64并引入使用…

快速上手C语言【上】(非常详细!!!)

目录 1. 基本数据类型 2. 变量 2.1 定义格式 和 命名规范 2.2 格式化输入和输出(scanf 和 printf) ​编辑 2.3 作用域和生命周期 3. 常量 4. 字符串转义字符注释 5. 操作符 5.1 双目操作符 5.1.1 算数操作符 5.1.2 移位操作符 5.1.3 位操作符…

已解决-Sentinel控制台明明正常启动,扫描不到客户端应用

今天启动Sentinel控制台的时候,明明启动成功,无报错,浏览器能正常访问,但就是无论如何都刷新不出来应用。 经排查才发现,我在启动了Sentinel控制台之后,对SpringBoot应用做了配置的更新,于是重启…

理解C语言之深入理解指针(五)

目录 1. sizeof和strlen的对⽐ 1.1 sizeo 1.2 strlen 1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析 2.1 ⼀维数组 2.2 字符数组 2.3 ⼆维数组 3. 指针运算笔试题解析 3.1 题⽬1: 3.2 题⽬2 3.3 题⽬3 3.4 题⽬4 3.5 题⽬5 3.6 题⽬6 3.7 题⽬…

【C语言】使用结构体实现位段

文章目录 一、什么是位段二、位段的内存分配1.位段内存分配规则练习1练习2 三、位段的跨平台问题四、位段的应用五、位段使用的注意事项 一、什么是位段 在上一节中我们讲解了结构体,而位段的声明和结构是类似的,它们有两个不同之处,如下&…

ribbon和nginx负载均衡图解

通俗来说 nginx: 规定一个地址v(比如v代理了地址a,b,c,d且他们都实现了同一个服务e),然后当我们的请求想要实现e服务而去请求v的时候,v实际上就会从a,b,c,d中选一个来让他们给请求者提供服务。 ribbon: …

探索scikit-learn的datasets模块:数据集的加载与使用

引言 在机器学习和数据分析领域,数据集的选择和准备是至关重要的一步。scikit-learn库的datasets模块为我们提供了多种内置的数据集,方便我们进行模型训练和测试。这些数据集既有大型的数据集,也有便于教学和初步探索的小型数据集。本文将重…

【LeetCode】动态规划—188. 买卖股票的最佳时机 IV(附完整Python/C++代码)

动态规划—188. 买卖股票的最佳时机 IV 题目描述前言基本思路1. 问题定义交易规则: 2. 理解问题和递推关系两种情况:状态定义:状态转移方程:初始条件: 3. 解决方法动态规划方法特殊情况:当 k 大于等于 pric…