C#-接口

本文详细介绍了C#中的接口概念,包括如何定义接口、接口的实现方式、多接口继承以及接口的重写和隐式实现。示例代码展示了如何在一个类中实现多个接口,并通过接口引用调用方法。同时,讨论了接口继承其他接口的情况,以及当接口方法签名不同时的处理方式。
摘要由CSDN通过智能技术生成

 

接口就是指定一组函数成员,而不实现他们的引用类型。

如何定义一个接口

一般来说接口名称首字母都是大写I

interface ICatchMice
        {
            void CatchMice();//默认public,但不能添加任何访问修饰符
        }

接口只能用来被实现

就像抽象类只能被继承

语法很像继承

Cat:IcatchMice
{
public void CatchMice(){....};//必须有实现
}

这是基本的一整段

 interface ICatchMice
    {
        void CatchMice();//默认public,但不能添加任何访问修饰符
    }
    interface IClimbTree
    {
        void ClimbTree();
    }
      class Pet
    {

    }
    class Cat :Pet,ICatchMice,IClimbTree
    {
        public Cat(string v)
        {
            V = v; 
        }

        public string V { get; }

        public void CatchMice()
        {
            Console.WriteLine("Catch mice");
        }
        public void ClimbTree()
        {
            Console.WriteLine("Climb tree");
        }
    } 
    class Program
    {
        static void Main()
        {
            Cat c = new Cat("Tom");
            IClimbTree Climb = c;
            c.CatchMice();
            Climb.ClimbTree();
            ICatchMice CatchM = c;
            CatchM.CatchMice();
        }
    }

这里要注意,一个类如果继承于父类而且引用多接口的话,父类要在第一位,接口要在后面

class Cat :Pet,ICatchMice,IClimbTree

虽然说 C#里一个类只能派生一个类,但是可以引用多接口

IClimbTree Climb = c;//有时候要是转换不成功的话就进行强制转换
//IClimbTree Climb = (IClimbTree)c;
            c.CatchMice();
            Climb.ClimbTree();
            ICatchMice CatchM = c;
            CatchM.CatchMice();

这种情况下,既可以通过接口的引用类型来访问

也可以通过对象来调用 

 接口可以继承其他接口

 public interface ICatchMice
        {
            void CatchMice();
        }
        public interface IClimbTree:ICatchMice
        {
            void ClimbTree();
           
        }

这样就相当于一个接口拥有了两个接口的方法

比如说下面有两个不同返回类型的方法Foo

如果不进行显式实现,则会报错

 如果方法签名和返回类型全部一样

那在类里面实现一次就可以了

不一样的话就像上面重新实现 返回类型+接口+方法 就可以了

public void CatchMice()
        {
            Console.WriteLine("Climb tree");
        }
        int ICatchMice.CatchMice()
        {
            Console.WriteLine("I got it");
            return 0;
        }

然后最后的类里实现的时候

static void Main()
        {
            Cat c = new Cat("Tom");
            c.CatchMice();
            ((ICatchMice)c).CatchMice();
            ((IClimbTree)c).CatchMice();
        }

由于int类型的CatchMice没有public

所以需要用(()).xxx这种方法去调用

 

隐式实现的接口成员默认是sealed的        

如果想要进行重写的话必须父类中把成员标记成virtual或者abstract

public interface ICatchMice
        {
            int CatchMice();
        }
        public class IClimbTree:ICatchMice
        {
        public void CatchMice() => Console.WriteLine("First thing");
        }
    public interface TakeFood:IClimbTree
    {
        public  void CatchMice() => Console.WriteLine("Two thing ");
    }

当我们去调用方法的时候

比如((ICatchMice)c).CatchMice 结果就会是First thing

然后((ICimbTree).c).CatchMice 结果就是 First thing

c.CatchMice结果就是 Two thing

public interface ICatchMice
        {
            int CatchMice();
        }
        public class IClimbTree:ICatchMice
        {
        public virtual void CatchMice() => Console.WriteLine("First thing");
        }
    public interface TakeFood:IClimbTree
    {
        public override void CatchMice() => Console.WriteLine("Two thing ");
    }

如这样重载之后,所有的结果都是Two thing 因为重写了就相当于是覆盖了前面的结果

显示接口不能被进行重写,但是可以重新实现接口

public interface ICatchMice
        {
            int CatchMice();
        }
        public class IClimbTree:ICatchMice
        {
        void ICatchMice.CatchMice() => Console.WriteLine("First thing");
        }
    public class TakeFood:IClimbTree,ICatchMice
    {
        public  void CatchMice() => Console.WriteLine("Two thing ");
    }

比如说这样,就不能重写

但是可以在需要用到接口的类重新声明

public class TakeFood:IClimbTree,ICatchMice

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值