C# 接口 interface

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();
    }
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值