• C# 抽象类与接口的区别


    之前自己一直都弄不明的C#的抽象类和接口的区别,在面试时也一直被问到这个问题,所以今天转下别人对这个问题写的理论内容,而自己编了简单例子作为练习。

    一、 定义

      抽象类:不与具体事物相联系,表达一种抽象的概念,仅是作为其派生类的一个基类。主要用来提供多个派生类可共享的基类的公共定义。

      接口:是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为,可以看成是实现一组类的模板。

    二、 相似之处     

      1.都是引用类型

      2.不能直接实例化

      3. 包含未实现的方法声明

      4. 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(方法、属性、事件、索引器或这4种成员的任何组合)

    三、 区别

      1.抽象类是为子类提供一个自定义抽象的基类。而接口是为子类定一个规则。

      2.抽象类中可以定义成员的实现,但接口中不可以

      3.抽象类不能被密封。

      4.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。

      5.抽象类中可以包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以。

      6.抽象类中的成员可以私有的、受保护的、内部的或受保护的内部成员,但接口中的成员必须是公共的。

    四、动机

      抽象类是为了继承实现代码重用。接口是为了实现多态性。

    以下是对应的简单例子

    一、抽象类例子

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace AbstractClass
    {
        public abstract class Cricle
        {
            private double r = 0;         //半径字段
    
            public double R               //半径属性
            {
                get { return r; }
                set { r = value; }
            }
    
            //抽象方法
            public abstract double Area();      //该抽象方法没有实现,只能重写后才能用。
                                                //抽象方法可以提供实现,也可以提供不实现。
                                                //带实现的子类可以直接用,也可以重写后再用。
        }
    
        public class Cricle1 : Cricle           //继承抽象类Cricle
        {
            public override double Area()       //实现抽象方法
            {
                return Math.PI * R * R;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("请输入圆的半径:");
                Cricle1 cricle1 = new Cricle1();
                cricle1.R = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("圆的面积为{0}", cricle1.Area());
            }
        }
    }

    二、接口例子

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Interface
    {
        interface Iselectlanguage       //声明一个借口,用于定义Speak方法,而具体Speak方法的功能的实现是在类中进行的,默认情况下访问权限为public
        {
            void Speak(string str);
        }
    
        public class ChinesePeople:Iselectlanguage //与中国人说话则说汉语
        {
            public void Speak(string str)
            {
                Console.WriteLine("中国人说{0}", str);
            }
        }
        public class EnglishPeople : Iselectlanguage //与美国人对话,则说英语
        {
            public void Speak(string str)
            {
                Console.WriteLine("英国人说{0}", str);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                ChinesePeople cp = new ChinesePeople();
                string language="你好!";
                cp.Speak(language);
            }
        }
    }
  • 相关阅读:
    算法 排序
    Windows系统安装Git
    oracle 查询语句
    .NET CORE AddRazorRuntimeCompilation
    清除html頁面文本框緩存
    ORACLE 生成UUID
    Unable to resolve service for type`***` while attempting to activatre `***`
    xml文件导入Oracle数据库
    jquery 日历控件
    判断并获取一对多表格数据
  • 原文地址:https://www.cnblogs.com/zhongsh/p/2796619.html
Copyright © 2020-2023  润新知