抽象类 vs 接口【概念解析系列_2】【C# 基础】

抽象类,vs,接口,概念,解析,系列,c#,基础 · 浏览次数 : 40

小编点评

**抽象类和接口的相似之处:** * 都能定义类中的成员方法和属性。 * 都可以继承其他类的成员。 * 都可以实现接口中的方法。 **抽象类和接口的区别:** * 抽象类不能直接创建对象,只能通过子类派生出新的对象。 * 接口可以包含属性、方法和事件,这些元素是接口的成员。 * 接口不能直接创建对象,但可以实现接口中的方法。 * 接口可以多实现,但抽象类只能继承一个类。

正文

〇、前言

抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下。

一、简介与示例

1.1 抽象类

抽象类就是不能使用 new 方法进行实例化的类,即没有具体实例对象的类。

抽象类有点类似于“模板”的作用,目的是根据其格式来创建和修改新的类,对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。

当一个类被声明为抽象类时,要在这个类前面加上修饰符 abstract,在抽象类中的成员方法可以包括一般方法和抽象方法。

抽象类中的方法就是仅包含声明语句的抽象方法。

抽象方法 就是以 abstract 修饰的方法。这种方法只声明返回的数据类型、方法名称、所需要的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。

当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是 abstract 的,而这个子类也必须是抽象的。

// 声明一个抽象类,包含一个抽象方法,但该方法未实现,返回类型为 string
abstract class MyAbstract
{
    public double parameter { get; set; }
    public abstract string AbMethod();
}
// 实现一个派生类,只能继承一个类
class MyClass : MyAbstract
{
    public override double parameter { get; set; }
    public override string AbMethod()
    {
        return "MyClass-AbMethod()");
    }
}

1.2 接口

接口声明了属性、方法和事件,这些都是接口的成员。接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有这一组规则。体现了自然界“如果你是……则必须能……”的理念。

在 C# 8.0 之前,接口只包含成员的声明而不关心成员的实现,只是提供派生类实现的标准结构。在此之后时代变了,接口也可以拥有自己的带实现的方法,而且在未实现此方法的派生类中不能调用。

大部分情况下,接口还是被认为只包含声明,在派生类中进行实现。接口中包含实现一般发生在需求变化时,为了不影响之前的派生类,此时带上实现使得其他派生类不必须实现该方法。

接口是在一定粒度视图上同类事物的抽象表示。注意这里我强调了在一定粒度视图上,也就是分类依据,因为“同类事物”这个概念是相对的,它因为粒度视图不同而不同。比如说,一棵树和一个人,在生物这一粒度上,可以分为一类,但在动物这个粒度上,他们就不能成为同一类。

// 接口声明
interface IinterfaceName
{
	int id { get; set; } // 属性
	string name { get; set; }
	double price { get; set; }
	double SalePrice(int discount); // 方法
}
// 类实现接口
public class ClassName : IinterfaceName
{
    public int id { get; set; }
    public string name { get; set; }
    public double price { get; set; }
    public double SalePrice(int discount)
    {
        double saleprice = price * discount * 0.1;
        return saleprice;
    }
}

二、抽象类和接口的关系

如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java 中),抽象类似乎完全能取代接口。

那么到底本质区别是啥呢?抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以根据系统场景,想想你的动机是什么。

 概念方面的区别

接口是对动作的抽象,抽象类是对根源的抽象。

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个人类,他们的抽象类是人,说明他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。

所以,在高级语言上,一个类只能继承一个类(包括抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

 应用方面的区别

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用。

参考:https://www.cnblogs.com/binyao/p/4891306.html    https://www.cnblogs.com/sunzhenyong/p/3814910.html

与抽象类 vs 接口【概念解析系列_2】【C# 基础】相似的内容:

抽象类 vs 接口【概念解析系列_2】【C# 基础】

抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下。

【VS Code 与 Qt6】QAction 类的一些事

QAction 类表示用户命令的一种抽象,包括命令文本、图标、命令触发后要执行的代码。菜单、工具栏按钮往往存在相同的功能,将这些命令独立抽出来,放到 QAction 以象上,可避免编写重复的代码。比如“文件”菜单下有“保存”命令,工具栏上也会有“保存”按钮。因此,创建一个表示“保存”的 QActio

Java 抽象类和接口

抽象类与接口的理解、设计思路与实际用途 在面向对象的编程中,抽象类和接口是两个非常重要的概念,它们为开发者提供了创建可重用、可扩展和可维护代码的基础。下面我们将从理解、设计思路和实际用途三个方面来探讨抽象类和接口。 1. 抽象类(Abstract Class) 理解: 抽象类是一种不能被实例化的类,

Abstract Factory 抽象工厂模式简介与 C# 示例【创建型1】【设计模式来了_1】

通过对抽象类和抽象工厂的一组实现,独立出一系列新的操作,客户端无需了解其逻辑直接访问。

MapStruct - 注解汇总

@Mapper @Mapper 将接口或抽象类标记为映射器,并自动生成映射实现类代码。 public @interface Mapper { // 引入其他其他映射器 Class[] uses() default {}; // 将类import 到生成的实现类中 // 可以使用 {@link

spring多数据源动态切换的实现原理及读写分离的应用

AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能、可扩展性、灵活性。

【Qt6】列表模型——便捷类型

前一篇水文中,老周演示了 QAbstractItemModel 抽象类的继承方法。其实,在 Qt 的库里面,QAbstractItemModel 类也派生了两个基类,能让开发者继承起来【稍稍】轻松一些。 这两个类是 QAbstractListModel 和 QAbstractTableModel。

鸿蒙HarmonyOS实战-Stage模型(应用上下文Context)

前言 应用上下文(Context)是应用程序的全局信息的接口。它是一个抽象类,提供了访问应用程序环境的方法和资源的方法。应用上下文可以用于获取应用程序的资源、启动Activity、发送广播等。每个应用程序都有一个应用上下文对象,它在整个应用程序的生命周期内都是唯一的。通过应用上下文,我们可以获得

Web API接口返回实现类集合的姿势了解

大家好,我是沙漠尽头的狼。 一. 问题描述 如下图,定义两个子类Student和Employ,都继承自抽象类PersonBase: public abstract class PersonBase { public string Name { get; set; } protected Person

简易的工厂设计模式

工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露对象的创建逻辑。在工厂模式中,我们定义一个接口或抽象类,该接口或抽象类用于创建对象,但让子类决定要实例化的类。工厂方法模式使类的实例化延迟到其子类。 下面是一个完整的C#实现案例: 首先,我们定义一个接口,用于创建对象: p