C# 继承(接口)

接口

如果一个类派生与一个接口,它就会执行某些函数。并不是所有的面向对象语言都支持接口。

熟悉COM的开发人员应注意,尽管在概念上C#接口类似于COM接口,但他们是不筒的,底层的结构不筒。比如,C#接口并不派生于IUnkown。C#接口根据.NET函数提供一个契约。于COM接口不同,C#接口不代表任何类型的二进制标准。Microsoft预定义的一个接口System.IDisposable的完整定义。IDisposable包含一个方法Dispose(),该方法由类执行,用于清理代码:

复制代码
public interface IDisposable
{
    void Dispose();
}

从上述代码可知,声明接口在语法上于声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。一般情况下,接口中只包含方法、属性、索引器和事件的声明。在接口定义中还不允许声明成员上的修饰符。接口成员总是公共的,不能声明为虚拟或静态。如果需要,就应执行的类来声明,最好通过执行的类来声明访问修饰符,就像上面的代码。

定义和实现接口

定义IBank接口:

复制代码
namespace Wrox.ProCSharp
{
    public interface IBankAccount
    {
        void PlayIn(decimal amount);
        bool Withdraw(decimal amount);
        decimal Balance
        {
            get;
        }
    }
}

注意,接口的名称为IBankAccount。接口名称传统上以字母I开头,一遍知道这是一个接口。

复制代码
namespace Wrox.ProCSharp.VenusBank
{
    public class SaverAccount:IBankAccount
    {
        private decimal balance;

        public void PayIn(decimal amount)
        {
            balance+=amount;
        }

        public bool Withdraw(decimal amount)
        {
            if(balance>amount)
            {
                balance-=amount;
                return true;
            }

            Console.WriteLine("Withdrawal attempt failed.");
            return false;
        }

        public decimal balance
        {
            get
            {
                return balance;
            }
        }

        public override string ToString()
        {
            return string.Format("Venus Bank Saver:Balance={0,6:C}",balance);
        }
    }
}

上述代码中,包含一个私有字段balance,当存款或取款时就调整这个字段。在上述代码中,唯一有趣的类时声明:

复制代码
public class SaverAccount:IBankAccount

SaverAccount派生于一个接口IbankAccount,没有明确指出任何其他基类(当然这表示SaverAccount直接派生于System.Object)。另,从接口中派生完全独立于从类中派生。SaverAccount派生于IBankAccount,表示它获取IBankAccount的所有成员,但接口并不是实际实现其方法,所以SaverAccount必须提供这些方法的所有实现代码。如果没有提供实现那代码,编译器会报错。接口仅表示其成员的存在性,类负责确定这些成员是虚拟还是抽象的(但只有在类本身是抽象的,这些成员才能是抽象的)。

不同类如何实现相同的接口。

复制代码
namespace Wrox.ProCSharp.JupiterBank
{
    public class GoldAccount:IBankAccount
    {
        //etc.
    }
}

示例

复制代码
using System;
using Wrox.PrCSharp
using Wrox.ProCSharp.VenusBank;
using Wrox.ProCSharp.JupiterBak;

namespace Wrox.ProCSharp
{
    class MainEntryCSharp
    {
        static void Main()
        {
            IBankAccount venusAccount=new SaverAccount();
            IBankAccount jupiterAccount=new GoldAccount();
            venusAccount.PayIn(200);
            venusAccount.Withdraw(100);
            Console.WriteLine(venusAccount.ToString());
            jupiterAccount.PayIn(500);
            jupiterAccount.Withdraw(600);
            jupiterAccount.Withdraw(100);
            Console.WriteLine(jupiterAccount.ToString());
        }
    }
  }

接口引用完全可以看做是类引用------但接口引用的强大之处在于,它可以引用任何实现该接口的类。

派生的接口

接口可以彼此继承,其方式与类的继承相同。

本文由mdnice多平台发布

相关推荐
zyt05025 小时前
四、计算机网络与分布式系统(中)
linux·计算机网络·程序人生
郝学胜-神的一滴6 小时前
深入探索 Python 元组:从基础到高级应用
运维·服务器·开发语言·python·程序人生
贝塔实验室7 小时前
两种常用的抗单粒子翻转动态刷新方法
论文阅读·经验分享·笔记·科技·学习·程序人生·fpga开发
H10020 小时前
拉帮结派下的制造麻烦
程序人生
郝学胜-神的一滴1 天前
Linux命令行的核心理念与实用指南
linux·运维·服务器·开发语言·程序人生
孤廖1 天前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
郝学胜-神的一滴2 天前
深入浅出 C++20:新特性与实践
开发语言·c++·程序人生·算法·c++20
孤廖2 天前
从 “模板” 到 “场景”,用 C++ 磨透拓扑排序的实战逻辑
开发语言·c++·程序人生·算法·贪心算法·动态规划·学习方法
武子康3 天前
AI-调查研究-74-具身智能 机器人学习新突破:元学习与仿真到现实迁移的挑战与机遇
人工智能·程序人生·ai·职场和发展·系统架构·机器人·具身智能
刀客1233 天前
测试之道:从新手到专家实战(四)
python·功能测试·程序人生·测试用例·集成测试·学习方法·安全性测试