zoukankan      html  css  js  c++  java
  • 【翻译】为什么我们要用抽象类?

    原文地址: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派生出来的类来说是共有的。连接的创建是由派生类指定的。因此,我们有一个抽象基类的抽象方法。

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

    总结

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

  • 相关阅读:
    SpringMVC-11-文件上传和下载
    SpringMVC-10-拦截器Interceptor
    SpringMVC-09-Ajax技术
    SpringMVC-08-整合SSM之CRUD
    SpringMVC-08-SpringMVC层编写
    SpringMVC-08-整合SSM之Spring层编写
    SpringMVC-08-Mybatis层编写
    SpringMVC-08-整合SSM之基本环境搭建
    SpringMVC-07-JSON讲解
    SpringMVC-06-数据处理
  • 原文地址:https://www.cnblogs.com/ExDevilLee/p/5755420.html
Copyright © 2011-2022 走看看