https://www.bilibili.com/video/BV1584y1B7xe/
在C#
中,接口(Interface
)是一种引用类型,它定义了一组方法的契约,但不包含实现。接口允许不同的类实现相同的方法集,从而使它们可以以一致的方式被其他代码使用。接口在C#
编程中扮演着非常重要的角色,它们是实现多态性的关键方式之一,同时也是实现代码解耦和增强代码可维护性的重要工具。
抽象类是对类的抽象,接口是对行为的抽象
接口只做行为进行约定而没有提供任何实现,因此不受只能单继承的限制。
组合优于继承
接口
接口可以看作是一个约定,其中定义了类或结构体继承接口后需要实现功能,接口的特点如下所示:
接口是一个引用类型,通过接口可以实现多重继承;
接口中只能声明"抽象"成员,所以不能直接对接口进行实例化;
接口中可以包含方法、属性、事件、索引器等成员;
接口名称一般习惯使用字母“I”作为开头(不是必须的,不这样声明也可以);
接口中成员的访问权限默认为 public,
所以我们在定义接口时不用再为接口成员指定任何访问权限修饰符,
否则编译器会报错;
在声明接口成员的时候,不能为接口成员编写具体的可执行代码,
也就是说,只要在定义成员时指明成员的名称和参数就可以了;
接口一旦被实现(被一个类继承),派生类就必须实现接口中的所有成员,
除非派生类本身也是抽象类。
接口声明
在 C#
中声明接口需要使用 interface
关键字,语法结构如下所示:
public interface InterfaceName{returnType funcName1(type parameterList);returnType funcName2(type parameterList);... ...
}
其中,InterfaceName
为接口名称,returnType
为返回值类型,funcName
为成员函数的名称,parameterList
为参数列表。
接口继承
如果一个接口继承其他接口,那么实现类或结构就需要实现所有接口的成员。
using System;namespace c.biancheng.net
{public interface IParentInterface{void ParentInterfaceMethod();}public interface IMyInterface : IParentInterface{void MethodToImplement();}class Demo : IMyInterface{static void Main(string[] args) {Demo demo = new Demo();demo.MethodToImplement();demo.ParentInterfaceMethod();}public void MethodToImplement(){Console.WriteLine("实现 IMyInterface 接口中的 MethodToImplement 函数");}public void ParentInterfaceMethod(){Console.WriteLine("实现 IParentInterface 接口中的 ParentInterfaceMethod 函数");}}
}
Number
class ComplexNumber: IShow {//私有成员 实部和虚部private double Real;private double Imaginary;//get setpublic double real {get { return Real; }set { Real = value; }}public double imaginary {get { return Imaginary; }set { Imaginary = value; }}//含参构造public ComplexNumber(double re = 0.0, double im = 0.0) {real = re;imaginary = im;}~ComplexNumber() { }//运算符重载public static ComplexNumber operator +(ComplexNumber a, ComplexNumber b) {ComplexNumber c = new ComplexNumber(0, 0);c.real = a.real + b.real;c.imaginary = a.imaginary + b.imaginary;return c;}//链式调用public ComplexNumber linkA(out double re) {re = real;return this;}public ComplexNumber linkB(out double im) {im = imaginary;return this;}public void showNumber() {System.Console.Write("{0} + {1}i", real, imaginary);}}class QNumber: IsayName {private int Qnumber;public int qnumber {get { return Qnumber; }set {if(value < 0) {value = 0;}Qnumber = value;}}public QNumber() : this(0) { }public QNumber(int qnum) {qnumber = qnum;}public static QNumber operator +(QNumber a, QNumber b) {QNumber c = new QNumber();c.qnumber = a.qnumber * b.qnumber + 100;return c;}public static QNumber operator -(QNumber a, QNumber b) {QNumber c = new QNumber();c.qnumber = a.qnumber - b.qnumber;if(c.qnumber < 0) { c.qnumber = 0; }return c;}public void showNumber() {System.Console.Write(qnumber);}public void sayName() {System.Console.Write("{0}", GetType().Name);}
}interface IShow {void showNumber();
}interface IsayName: IShow {void sayName();
}
Program
using System;//主程序入口
class TODO {static void Main() {//Console.WriteLine("Hello C#!");//ComplexNumber a = new ComplexNumber(1, 2);//ComplexNumber b = new ComplexNumber(2, 5);//ComplexNumber c = new ComplexNumber();//c = a + b;//Console.WriteLine("c = {0} + {1}i",// c.real, c.imaginary);//double rea, imb;//c.linkA(out rea).linkB(out imb);//Console.WriteLine("rea = {0}, imb = {1}", rea, imb);QNumber v = new QNumber(20);QNumber m = new QNumber(25);QNumber s = m - v;s.showNumber();System.Console.WriteLine();s.sayName();}
}