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 set
public 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();
}
}