C#学习之接口

来源:互联网 发布:甘肃省网络研修社区 编辑:程序博客网 时间:2024/04/23 19:44

 

什么是接口?其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致。个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的。注意,虽然在概念上,C#接口类似于COM接口,但他们的底层结构是不同的。那么,我们来看一下如何声明和使用接口。

  声明接口

  声明接口在语法上和声明抽象类完全相同,例如这里有一个银行账户的接口:

  

public interface IBankAccount

{

    void PayIn(decimal amount);

    bool Withdraw(decimal amount);

    decimal Balance

    {

        get;

    }

}

  注意:接口中只能包含方法、属性、索引器和事件的声明。不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。

  使用接口的例子

  这是书上的一个简单的例子,但足以说明接口的使用方法。

  一个银行账户的接口,两个不同银行账户的实现类,都继承于这个接口。接口声明如上。下面是两个账户类:

 

class SaverAccount : IBankAccount

{

    private decimal balance;

    public decimal Balance

    {

        get 

        {

            return balance;    

        }

    }

    public void PayIn(decimal amount)

    {

        balance += amount;

    }

    public bool Withdraw(decimal amount)

    {

        if (balance >= amount)

        {

            balance -= amount;

            return true;

        }

        Console.WriteLine("Withdraw failed.");

        return false;

    }

    public override string ToString()

    {

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

    }

}

 

class GoldAccount : IBankAccount

{

    private decimal balance;

    public decimal Balance

    {

        get 

        {

            return balance;

        }

    }

    public void PayIn(decimal amount)

    {

        balance += amount;

    }

    public bool Withdraw(decimal amount)

    {

        if (balance >= amount)

        {

            balance -= amount;

            return true;

        }

        Console.WriteLine("Withdraw failed.");

        return false;

    }

    public override string ToString()

    {

        return String.Format("Jupiter Bank Saver:Balance={0,6:C}", balance);

    }

}

  可见,这两个实现类多继承了IBankAccount接口,因此它们必须要实现接口中的所有声明的方法。要不然,编译就会出错。让我们来测试一下,下面是测试代码:

 

static void Main(string[] args)

{

    IBankAccount venusAccount = new SaverAccount();

    IBankAccount jupiterAccount = new CurrentAccount();

    venusAccount.PayIn(200);

    jupiterAccount.PayIn(500);

    Console.WriteLine(venusAccount.ToString());

    jupiterAccount.PayIn(400);

    jupiterAccount.Withdraw(500);

    jupiterAccount.Withdraw(100);

    Console.WriteLine(jupiterAccount.ToString());

}

  请注意开头两句,我们把它们声明为IBankAccount引用的方式,而没有声明为类的引用,为什么呢?因为,这样我们就可以让它指向执行这个接口的任何类的实例了,比较灵活。但这也有个缺点,如果我们要执行不属于接口的方法,比如这里重载的ToString()方法,就要先把接口的引用强制转换成合适的类型了。

  接口的继承

  接口也可以彼此继承,就象类的继承一样。比如我们又声明一个接口ITransferBankAccount,它继承于IBankAccount接口。

 

interface ITransferBankAccount : IBankAccount 

{

    bool TransferTo(IBankAccount destination, decimal amount);

}

  在这个接口中,又新增加了一个方法TransferTo(),所以如果我们要写一个类从ITransferBankAccount继承的话,就必须要实现IBankAccount和ITransferBankAccount两个接口所有的方法声明。即:

 

C学习之接口 - 坚晗 - 我的博客class CurrentAccount : ITransferBankAccount

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客    private decimal balance;

C学习之接口 - 坚晗 - 我的博客

C学习之接口 - 坚晗 - 我的博客    public decimal Balance

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客    C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客        get

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客        C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客            return balance;

C学习之接口 - 坚晗 - 我的博客        }

C学习之接口 - 坚晗 - 我的博客    }

C学习之接口 - 坚晗 - 我的博客

C学习之接口 - 坚晗 - 我的博客    public void PayIn(decimal amount)

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客    C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客        balance += amount;

C学习之接口 - 坚晗 - 我的博客    }

C学习之接口 - 坚晗 - 我的博客

C学习之接口 - 坚晗 - 我的博客    public bool Withdraw(decimal amount)

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客    C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客        if (balance >= amount)

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客        C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客            balance -= amount;

C学习之接口 - 坚晗 - 我的博客            return true;

C学习之接口 - 坚晗 - 我的博客        }

C学习之接口 - 坚晗 - 我的博客        Console.WriteLine("Withdraw failed.");

C学习之接口 - 坚晗 - 我的博客        return false;

C学习之接口 - 坚晗 - 我的博客    }

C学习之接口 - 坚晗 - 我的博客

C学习之接口 - 坚晗 - 我的博客    public override string ToString()

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客    C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客        return String.Format("Jupiter Bank Saver:Balance={0,6:C}", balance);

C学习之接口 - 坚晗 - 我的博客    }

C学习之接口 - 坚晗 - 我的博客

C学习之接口 - 坚晗 - 我的博客    public bool TransferTo(IBankAccount destination, decimal amount)

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客    C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客        if (Withdraw(amount))

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客        C学习之接口 - 坚晗 - 我的博客{

C学习之接口 - 坚晗 - 我的博客            destination.PayIn(amount);

C学习之接口 - 坚晗 - 我的博客            return true;

C学习之接口 - 坚晗 - 我的博客        }

C学习之接口 - 坚晗 - 我的博客        else

C学习之接口 - 坚晗 - 我的博客C学习之接口 - 坚晗 - 我的博客        C学习之接口 - 坚晗 - 我的博客

C学习之接口 - 坚晗 - 我的博客            return false;

C学习之接口 - 坚晗 - 我的博客        }

C学习之接口 - 坚晗 - 我的博客    }

C学习之接口 - 坚晗 - 我的博客}

 

  总结起来说,使用C#接口应注意几个问题:

  1、C#中的接口是独立于类来定义的。这与 C++模型是对立的,在 C++中接口实际上就是抽象基类。

  2、接口和类都可以继承多个接口。

  3、类可以继承一个基类,接口根本不能继承类。这种模型避免了 C++的多继承问题,C++中不同基类中的实现可能出现冲突。因此也不再需要诸如虚拟继承和显式作用域这类复杂机制。C#的简化接口模型有助于加快应用程序的开发。

  4、一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。

  5、接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ipad无法验证登录怎么办 dnf电脑配置低怎么办 淘宝直播粉丝不够怎么办 电脑页面显示不全怎么办 脸上发痒长痘怎么办 扣扣魔性表情泡泡消失怎么办 脚起小泡泡很痒怎么办 孕妇脚痒起水泡怎么办 孕妇手脚起湿疹怎么办 嘴巴破皮了怎么办 小便刺痛阴唇红肿怎么办 集成墙面挂照片怎么办 苹果电脑网页游戏打不开怎么办 苹果6plus发热怎么办 玩手游手机太卡怎么办 苹果七发烫厉害怎么办 苹果手机延迟高怎么办 王者荣耀总是卡怎么办 王者荣耀卡屏怎么办 王者荣耀网络延迟怎么办 荣耀8手机卡了怎么办 荣耀v10有点卡怎么办 荣耀10有点卡怎么办 8g内存吃鸡会崩怎么办 玩看门狗很卡怎么办 拼多多人数不够怎么办 玩cf想吐怎么办 玩手机头晕恶心怎么办 玩手机头疼恶心怎么办 看手机想吐怎么办 英雄联盟取名后怎么办 王者荣耀改名重复怎么办 刺激战场改名重复怎么办 省钱快报忘记密码怎么办 手机直播网速卡怎么办 触手tv直播黑屏怎么办 酷狗id密码忘记怎么办 打游戏网络不稳定怎么办 电脑打字法没了怎么办 家庭版密钥专业版系统怎么办 win7应用程序不能启动怎么办