文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

在我之前的一篇文章中,我写过为什么我们要在C#中使用接口?。在C#语言中有一个很重要的类:抽象类。一个抽象类中可以拥有一个或多个抽象方法(仅有方法签名)。接口仅包含方法签名。在C#中抽象类和接口有什么区别呢?这是C#面试中最常见的问题之一:什么是抽象类,我们为什么要使用抽象类?

本文首次刊登于DotNet for all

想了解更多关于virtual、override、new和abstract关键字的知识:请点击这里

第 1 段(可获 1.28 积分)

抽象类和接口的区别

抽象类接口
抽象类不能实例化。接口仅能用做类型变量,不能实例化。
有构造函数。没有构造函数。
可派生出其他的类。需要通过实现该接口的类创建。
可拥有一个或多个具体实现的方法。不能有函数定义。
具体类只能实现一个抽象类。具体类可以实现多个接口。
可以有抽象方法,也可以没有。只能有方法签名。
可以有private、protected、internal类型的数据成员。所有成员默认是public类型。
不能被结构体继承。可以被结构体继承。
第 2 段(可获 1.5 积分)

抽象类的真实应用

接下来讲一讲抽象类的真实应用。大多数人对于抽象类的理论知识都已经非常了解了,但是关于抽象类的实践并不是太有把握。

抽象类实践

public abstract class DataSource  
{  
    protected string dataSourceName;  
    private string environment;  
    protected DataSource(string environment, string dsName) {  
        this.environment = environment;  
        this.dataSourceName = dsName;  
        GetDataSourceCredentials();  
    }  
    private void GetDataSourceCredentials() {  
        Console.WriteLine(string.Format("Get {0}'s connection setting for {1} environment from config file", dataSourceName, environment));  
    }  
    public abstract void OpenAndReturnConnection();  
}  
public class MsSqlDataSource: DataSource {  
    public MsSqlDataSource(string environment): base(environment, "MsSQL") {}  
    public override void OpenAndReturnConnection() {  
        Console.WriteLine(string.Format("Create and return Connection for {0} dataSource", dataSourceName));  
    }  
}  
public class OracleDataSource: DataSource {  
    public OracleDataSource(string environment): base(environment, "Oracle") {}  
    public override void OpenAndReturnConnection() {  
        Console.WriteLine(string.Format("Create and return Connection for {0} dataSource", dataSourceName));  
    }  
}  

 

第 3 段(可获 0.55 积分)

我们应该知道一个抽象类可以有它的实现方法。在上诉的代码中,我创建了一个叫做DataSource的抽象类基类。

由这个基类派生的具体实现类有:MsSqlDataSource和OracleDataSource。

具体实现类将会有自己打开连接的方式。它们应该有一个常见的方式来获取配置文件的连接字符串。

在我们的应用中,我们有机会使用不同的数据库,例如:微软的SQLServer、甲骨文的Oracle或者也有可能是微软的Excel文件。在上诉提到的代码中,有一个私有方法可以根据数据库名称和环境(例如:DEV、QA或PROD) 从配置文件中获取数据库的连接字符串。

第 4 段(可获 1.6 积分)

如果你执行如下代码:

DataSource sqlDS = new MsSqlDataSource("DEV"); 
sqlDS.OpenAndReturnConnection(); 

我们将得到下面的输出结果:

output

在这里,我给DEV环境取的了连接字符串。这个功能对于所有从DataSource派生出来的类来说是共有的。连接的创建是由派生类指定的。因此,我们有一个抽象基类的抽象方法。

虽然,它是一个非常基础的小例子,但它可以帮助你了解抽象类的使用。

总结

在这篇文章中,我们讨论了抽象类以及它与接口的区别。文章中还有一个让你了解抽象类的小例子。

第 5 段(可获 1.38 积分)

文章评论