抽象类 vs 接口【概念解析系列_2】【C# 基础】
〇、前言
抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下。
一、简介与示例
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
本文来自博客园,作者:橙子家,欢迎微信扫码关注博主【橙子家czzj】,有任何疑问欢迎沟通,共同成长!