做正规网站有哪些,东莞市企业信息查询网,宁波网站开发公司电话,管理咨询公司的成本有哪些视频地址#xff1a;一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili
强烈推荐学习C#和WPF的朋友关注此UP#xff0c;知识点巨多#xff0c;讲解透彻#xff01;
一、总览
public interface IOverall
{/// summary/// 最普通的方法/// /summaryv…视频地址一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili
强烈推荐学习C#和WPF的朋友关注此UP知识点巨多讲解透彻
一、总览
public interface IOverall
{/// summary/// 最普通的方法/// /summaryvoid Foo();/// summary/// 属性/// /summarystring Name { get;set; }/// summary/// 索引器/// /summary/// param nameindex/param/// returns/returnsint this[int index] { get; set; }/// summary/// 事件/// /summaryevent EventHandler OnNameChanged;/// summary/// 带默认实现的方法/// /summaryvoid Bar() Console.WriteLine(Bar);/// summary/// 私有方法需要带默认实现/// /summaryprivate void NonPublicMethod1() Console.WriteLine(Private);/// summary/// 受保护方法需要带默认实现或者可以不实现继承后实现/// /summaryprotected void NonPublicMethod2() Console.WriteLine(Protected);/// summary/// 静态方法需要带默认实现/// /summarystatic void StaticMethod() Console.WriteLine(Static);/// summary/// 抽象静态方法/// /summarystatic abstract void AbstractStaticMethod();/// summary/// 静态虚方法需要带默认实现/// /summarystatic virtual void VirtualStaticMethod() Console.WriteLine(Virtual Static);
}
二、带默认实现的方法
C# 8.0引入
如果接口的方法提供了一个默认实现那么实现该接口的类可以不实现此方法。
如果实现了此方法则会覆盖接口中的默认实现可以理解为接口中带默认实现的方法其实是virtual而类中的如果实现了此方法其实是override。
2.1 用法
参考以下代码
Test test new Test();
((IFoo1)test).Foo1();
((IFoo1)test).Foo2();public interface IFoo1
{ void Foo1(){$这是{nameof(IFoo1)}中{nameof(Foo1)}的默认实现.Dump();}void Foo2(){$这是{nameof(IFoo1)}中{nameof(Foo2)}的默认实现.Dump();}
}class Test : IFoo1
{ public void Foo1(){$这是{nameof(Test)}中{nameof(Foo1)}的实际实现.Dump();}
}
输出结果为
这是Test中Foo1的实际实现
这是IFoo1中Foo2的默认实现
对于带默认实现的方法如果类中不实现此方法调用时需要先将类转换成接口再调接口上的方法参考以下代码
Test test new Test();
((IFoo1)test).Foo1();
((IFoo2)test).Foo1();public interface IFoo1
{void Foo1(){$这是{nameof(IFoo1)}中{nameof(Foo1)}的默认实现.Dump();}
}public interface IFoo2
{void Foo1(){$这是{nameof(IFoo2)}中{nameof(Foo1)}的默认实现.Dump();}
}class Test : IFoo1,IFoo2
{ }
接口IFoo1和IFoo2都有一个带默认实现的方法且名称相同类Test实现了IFoo1和IFoo2如果直接能访问到接口中的方法Foo1就会造成冲突。
2.2 应用场景
在不破坏影响已有实现的情况下可以添加新成员。这解决了在第三方已经大量使用了的接口上进行扩展带来问题的痛点。
2.3 private,带默认实现的方法
只能在接口内调用子接口实现接口的类中不可访问参考以下代码
Test test new Test();
((IFoo1)test).Foo1();public interface IFoo1
{ void Foo1(){Foo2();}private void Foo2(){$这是{nameof(IFoo1)}中{nameof(Foo2)}的默认实现.Dump();}
}class Test : IFoo1
{ }
2.4 protected,带默认实现的方法
可以在子接口中调用或者覆盖实现接口的类不可访问
参考以下代码 Test1 test1 new Test1();
((IFoo2)test1).Foo2();
((IFoo3)test1).Foo2();public interface IFoo1
{ protected void Foo1(){$这是{nameof(IFoo1)}中{nameof(Foo1)}的默认实现.Dump();}
}public interface IFoo2 : IFoo1
{void Foo2(){Foo1();}
}public interface IFoo3 : IFoo1
{void Foo2(){Foo1();}new void Foo1(){$这是{nameof(IFoo3)}中{nameof(Foo1)}的默认实现.Dump();}
}class Test1:IFoo2,IFoo3
{
}运行结果
这是IFoo1中Foo1的默认实现
这是IFoo3中Foo1的默认实现
2.5 Static,带默认实现的方法
静态方法一般用于处理泛型类
参考以下代码
var student IDeserializableStudent.Deserialize({\Id\:42,\Name\:\Jack\});
student.Dump();interface IDeserializableT
{static T? Deserialize(string json) JsonSerializer.DeserializeT(json);
}class Student : IDeserializableStudent
{public int Id {get;set;}public string Name { get; set; }
}
运行结果 三、static abstract,抽象静态方法
在接口可不实现实现此接口的类必须要实现此方法
应用场景
3.1 约束子类具有方法Deserializable实现序列化功能
interface IDeserializableT
{static abstract T Deserializable(string json);
}class MyDataModel : IDeserializableMyDataModel
{public static MyDataModel Deserializable(string json){return JsonSerializer.DeserializeMyDataModel(json);}
}
3.2 如工厂类中具有方法Create提供创建功能 interface IFactoryT{static abstract T Create();}class ClassToBeCreated{}class ClassWithFactoryMethod : IFactoryClassToBeCreated{public static ClassToBeCreated Create(){return new ClassToBeCreated();}}
3.3 约束子类实现静态单例 interface ISingletonT where T : ISingletonT{static abstract T Instance { get; }}class SingletonClass : ISingletonSingletonClass{private static readonly LazySingletonClass instanceHolder new LazySingletonClass();public static SingletonClass Instance instanceHolder.Value;}
3.4 逻辑运算法提供自定义逻辑运算 interface IOperatorsT where T : IOperatorsT{static abstract T operator (T left, T right);static abstract T operator -(T left, T right);}class MyNumber : IOperatorsMyNumber{public int Value { get; }public MyNumber(int value){Value value;}public static MyNumber operator (MyNumber left, MyNumber right){return new MyNumber(left.Value right.Value);}public static MyNumber operator -(MyNumber left, MyNumber right){return new MyNumber(left.Value - right.Value);}}
四、static virtual 静态虚方法
通常用于泛型调用的场合
特性
1.子类如果未实现具体方法调用时调用接口中的方法
2.子类如果实现具体方法调用时调用子类中的方法
代码
TestCallerInstance(new A());
TestCallerInstance(new B());
ITestInterfaceGenricA.TestCallerGeneric();
ITestInterfaceGenricB.TestCallerGeneric();static void TestCallerInstanceT(T t) where T : ITestInterface
{Console.WriteLine(T.TestString1());
}public interface ITestInterface
{static virtual string TestString1(){return TestString1 ITestInterface;}
}public interface ITestInterfaceGenricTSelf where TSelf : ITestInterfaceGenricTSelf
{public static void TestCallerGeneric(){Console.WriteLine(TSelf.TestString2());}static virtual string TestString2(){return TestString2 ITestInterfaceGeneric;}
}public class A : ITestInterface, ITestInterfaceGenricA
{public static string TestString2(){return TestString A;}
}public class B : ITestInterface, ITestInterfaceGenricB
{public static string TestString1(){return TestString1 ITestInterface B;}
}
运行结果
TestString1 ITestInterface
TestString1 ITestInterface B
TestString A
TestString2 ITestInterfaceGeneric