C#(二十)之C#接口interface

简介: 接口的功能为一下两点:1:接口作为约束与规范 2:优化程序设计

QQ图片20220426141512.jpg

最近工作中需要使用到接口interface。可是接口是用来做什么的?我看了一些网上的例子。


目前我看到的大多数接口的功能为以下两点:


1:接口作为约束与规范


我们可以根据需求来定义接口,然后我们再定义类来实现这个接口。接口为一个或多个类提供规范。


2:优化程序设计


面向对象设计中我们追求的原则之一就是高内聚,低耦合。可是类与类之间往往会有千丝万缕的关系,比如泛化、实现、组合、聚合、关联、依赖。而接口则可以将一个类对另一个类的依赖性降到最低,这就是【接口隔离】


举个例子:


我们现在有三个类:行为类、猫类、金鱼类。


行为类中定义了各种动物的行为,比如:抓老鼠,吐泡泡,挖洞,游泳等。


猫类需要使用到行为类中的抓老鼠方法。


金鱼类需要使用到行为类中的吐泡泡方法。


如果我们不使用接口,我们将把行为类中的所有方法都授予猫类和金鱼类,这显然是不合适的。


如果使用接口,我们定义两个接口,一个猫接口,里边一个抓老鼠方法。一个金鱼接口,里边一个吐泡泡方法。这两个接口,都由行为类来实现。这样猫类和金鱼类就使用到了他们各自所需要的方法,而其他行为方法并没有授予给他们。


实现这个例子之前呢,我们来看下接口的基础知识。


在定义接口时候要注意如下几点:


(1)接口声明不能包含以下成员:


数据成员、静态成员。


(2)接口声明只能包含如下类型的非静态成员函数的声明:


方法、属性、事件、索引器。


(3)这些函数成员的声明不能包含任何实现代码,而在每一个成员声明的主体后必须使用分号结尾。


(4)定义接口命名基本上以大写的 ‘I’ 开头,当然这个不是一定的。只是一种个人习惯。


(5)接口声明可以有任何的访问修饰符,public、protected、internal、private


(6)接口中的方法默认public ,且不允许添加任何修饰符


(7)实现类必须实现其所要实现的接口类中的所有方法


(8)接口是可以多继承继承的,但是可以多层继承。


(9)接口不能实例化(创建对象),只能被实现。


实例代码:声明接口(这里以C#作为例子)


Public interface InterfaceGc
{
 // 存款
 void PayIn(decimal amount);
 // 取款
 bool QuKuan(decimal amount);
 // 余额(只读)
 decimal Sheng{
    get;
 }
}


接口单继承:


/// <summary>
        /// 定义一个存取款接口
        /// </summary>
        interface InterfaceGc
        {
            // 存款
            void PayIn(decimal amount);
            // 取款
            bool QuKuan(decimal amount);
            // 余额(只读)
            decimal Sheng
            {
                get;
            }
        }
        /// <summary>
        /// 定义一个转账接口继承存取款接口,只能是单继承
        /// </summary>
        interface InterfaceNew : InterfaceGc
        {
            // 定义一个接口方法
            bool TranceTo(InterfaceGc destination, decimal amount);
        }


下边我写了两个例子


一个是刚刚上边说到的两个动物的行为,另一个是关于银行取钱存钱及转账的例子


1:动物行为:我这里使用的是控制台应用程序。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace @interface
{
    class Program
    {
        static void Main(string[] args)
        {
            cat catss = new cat();
            catss.iscat();
            Console.WriteLine("-------------------------------------------");
            fish fishsss = new fish();
            fishsss.isfish();
            Console.ReadLine();
        }
    }
    /// <summary>
    /// 行为类,同时实现Icat和Ifish两个接口
    /// </summary>
    public class xingwei : Icat,Ifish
    {
        public void zhua()
        {
            Console.WriteLine("抓老鼠");
        }
        public void pao()
        {
            Console.WriteLine("吐泡泡");
        }
        public void swim()
        {
            Console.WriteLine("游泳");
        }
    }
    /// <summary>
    /// 猫类
    /// </summary>
    public class cat
    {
        public Icat cats = new xingwei();
        public void iscat()
        {
            Console.WriteLine("我是一只猫");
            cats.zhua();
        }
    }
    /// <summary>
    /// 金鱼类
    /// </summary>
    public class fish
    {
        // 接口不能实例化,但是我们可以实例化实现接口的类
        // 通过这个类来调用你所需要的方法
        public Ifish fishes = new xingwei();
        public void isfish()
        {
            Console.WriteLine("我是一只金鱼");
            fishes.pao();
        }
    }
    /// <summary>
    /// 猫专用接口
    /// </summary>
    public interface Icat
    {
        void zhua();
    }
    /// <summary>
    /// 鱼专用接口
    /// </summary>
    public interface Ifish
    {
        void pao();
    }
}


2:银行存取款及转账方法:控制台应用程序


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace interfaceBank
{
    class Program
    {
        static void Main(string[] args)
        {
            // 调用继承接口的类(注意这个写法---多态)
            // 接口的对象可以调用类中的普通方法
            InterfaceGc myAccount = new Bank();
            InterfaceNew youAccount = new Inter();
            //我先存钱
            myAccount.PayIn(1000);
            //我再取钱
            myAccount.QuKuan(1200);
            // 你先存钱
            youAccount.PayIn(5000);
            // 你给我转账
            youAccount.TranceTo(myAccount, 500);
            // 查看我的余额
            decimal myYue;
            myYue = myAccount.Sheng;
            Console.WriteLine("我的余额:" + myYue);
            //查看你的余额
            decimal youYue;
            youYue = youAccount.Sheng;
            Console.WriteLine("你的余额:" + youYue);
            Console.ReadLine();
        }
        /// <summary>
        /// 银行类:实现存取款接口
        /// </summary>
        class Bank : InterfaceGc
        {
            // 定义一个余额
            private decimal blanace;
            // 重写接口中定义好的存钱类
            public void PayIn(decimal amount)
            {
                blanace += amount;
            }
            // 重写接口中定义好的取钱类
            public bool QuKuan(decimal amount)
            {
                // 判断余额是否大于要取得钱数
                if (blanace > amount)
                {
                    blanace -= amount;
                    return true;
                }
                else
                {
                    Console.WriteLine("余额不足,取款失败");
                    return false;
                }
            }
            // 重写余额接口
            public decimal Sheng
            {
                get
                {
                    return blanace;
                }
            }
        }
        /// <summary>
        /// 定义一个转账类实现转账接口
        /// </summary>
        class Inter : InterfaceNew
        {
            // 定义一个余额
            private decimal blanace;
            // 重写接口中定义好的存钱类
            public void PayIn(decimal amount)
            {
                blanace += amount;
            }
            // 重写接口中定义好的取钱类
            public bool QuKuan(decimal amount)
            {
                // 判断余额是否大于要取得钱数
                if (blanace > amount)
                {
                    blanace -= amount;
                    return true;
                }
                else
                {
                    Console.WriteLine("余额不足,取款失败");
                    return false;
                }
            }
            // 重写余额接口
            public decimal Sheng
            {
                get
                {
                    return blanace;
                }
            }
            // 转账接口
            public bool TranceTo(InterfaceGc obj, decimal amount)
            {
                bool result = QuKuan(amount);
                if (result == true)
                {
                    obj.PayIn(amount);
                }
                return result;
            }
        }
        /// <summary>
        /// 定义一个存取款接口
        /// </summary>
        interface InterfaceGc
        {
            // 存款
            void PayIn(decimal amount);
            // 取款
            bool QuKuan(decimal amount);
            // 余额(只读)
            decimal Sheng
            {
                get;
            }
        }
        /// <summary>
        /// 定义一个转账接口继承存取款接口,只能是单继承
        /// </summary>
        interface InterfaceNew : InterfaceGc
        {
            // 定义一个接口方法
            bool TranceTo(InterfaceGc destination, decimal amount);
        }
    }
}


目录
相关文章
|
7月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
231 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
7月前
|
IDE C# 开发工具
C#系列之接口介绍
C#系列之接口介绍
|
7月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
4天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
22 5
|
2月前
|
C#
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
50 9
|
3月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
130 5
|
4月前
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
91 1
|
4月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
38 0
|
7月前
|
前端开发 API C#
C# 接口
C# 接口
45 1
|
7月前
|
C# 开发者 索引
C# 11.0中的静态抽象成员:接口中的新变革
【1月更文挑战第25天】C# 11.0引入了接口中的静态抽象成员,这一新特性为接口设计带来了更大的灵活性。静态抽象成员允许在接口中定义静态方法和属性,并要求实现类提供具体的实现。本文将详细探讨C# 11.0中静态抽象成员的工作原理、优势及其对现有编程模式的影响,旨在帮助读者更好地理解和应用这一新特性。