【翻译】为什么我们要用抽象类?
原文地址:Why Do We Use Abstract Class?
译文地址:为什么我们要用抽象类?
为什么我们要用抽象类?
在我之前的一篇文章中,我写过为什么我们要在C#中使用接口?。在C#语言中有一个很重要的类:抽象类。一个抽象类中可以拥有一个或多个抽象方法(仅有方法签名)。接口仅包含方法签名。在C#中抽象类和接口有什么区别呢?这是C#面试中最常见的问题之一:什么是抽象类,我们为什么要使用抽象类?
本文首次刊登于DotNet for all。
想了解更多关于virtual、override、new和abstract关键字的知识:请点击这里。
抽象类和接口的区别
抽象类 | 接口 |
抽象类不能实例化。 | 接口仅能用做类型变量,不能实例化。 |
有构造函数。 | 没有构造函数。 |
可派生出其他的类。 | 需要通过实现该接口的类创建。 |
可拥有一个或多个具体实现的方法。 | 不能有函数定义。 |
具体类只能实现一个抽象类。 | 具体类可以实现多个接口。 |
可以有抽象方法,也可以没有。 | 只能有方法签名。 |
可以有private、protected、internal类型的数据成员。 | 所有成员默认是public类型。 |
不能被结构体继承。 | 可以被结构体继承。 |
抽象类的真实应用
接下来讲一讲抽象类的真实应用。大多数人对于抽象类的理论知识都已经非常了解了,但是关于抽象类的实践并不是太有把握。
抽象类实践
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)); } }
我们应该知道一个抽象类可以有它的实现方法。在上诉的代码中,我创建了一个叫做DataSource的抽象类基类。
由这个基类派生的具体实现类有:MsSqlDataSource和OracleDataSource。
具体实现类将会有自己打开连接的方式。它们应该有一个常见的方式来获取配置文件的连接字符串。
在我们的应用中,我们有机会使用不同的数据库,例如:微软的SQLServer、甲骨文的Oracle或者也有可能是微软的Excel文件。在上诉提到的代码中,有一个私有方法可以根据数据库名称和环境(例如:DEV、QA或PROD) 从配置文件中获取数据库的连接字符串。
如果你执行如下代码:
DataSource sqlDS = new MsSqlDataSource("DEV"); sqlDS.OpenAndReturnConnection();
我们将得到下面的输出结果:
在这里,我给DEV环境取的了连接字符串。这个功能对于所有从DataSource派生出来的类来说是共有的。连接的创建是由派生类指定的。因此,我们有一个抽象基类的抽象方法。
虽然,它是一个非常基础的小例子,但它可以帮助你了解抽象类的使用。
总结
在这篇文章中,我们讨论了抽象类以及它与接口的区别。文章中还有一个让你了解抽象类的小例子。
此文只为记录编程过程中积攒的思想与经验,若您有更好的思路希望您能给我留言,谢谢啦!~
posted on 2016-08-10 09:23 ExDevilLee 阅读(380) 评论(0) 编辑 收藏 举报