值类型也能实现接口。

📅 2026/7/6 4:16:39
值类型也能实现接口。
尽管可能很多人连值类型都没用过但值类型可以实现接口是一个非常有用的特性。当值类型转换为接口类型时会自动装箱成引用类型从而实现多态但一般用值类型实现接口的老鸟都不会被这些小陷阱所迷惑的。2、除了接口没有什么类型可以不实现接口抽象类可以不实现接口其实不然抽象类只能抽象接口的实现即将实现变为abstract的但不能不实现接口。也许你会疑惑abstract实现接口成员和不实现接口成员到底有区别尽管区别不大但还是存在的从理论上来说的话就是slot上的方法的区别。抽象类用abstract成员实现接口后子类再override来实现抽象类的abstract成员这会使得子类的实现是在abstract实现之下而不是直接在接口成员之下。从实际效果上来说由于抽象类的abstract的实现存在使得子类中可以选择对抽象类和接口进行分别实现重新实现接口。3、但事实上接口也不能实现接口只是把多个接口捆绑起来。一段有趣的代码如下public interface IA { void Test(); } public interface IB : IA { } public interface IC : IA { } public interface ID : IB, IC { }当实现ID时等于同时实现ID、IC、IB和IA但事实上你只需要实现一个Test方法也只能实现一个Test方法也就是IA.TestIB、IC、ID都是没有Test方法的。当然你可以尝试在IB或是其他接口中再放入一个Test便会产生一些奇妙的事情。4、同一接口成员在同一类型中只能被实现一次。显示实现接口已经不是什么秘密了但很多人却并不知道如果你显示实现了接口那么隐式实现就不存在了。这就是接口只能被实现一次public interface IA { void Test(); } public interface IB { void Test(); } public class TestClass : IA, IB { public void Test() { throw new NotImplementedException(); } void IB.Test() { throw new NotImplementedException(); } }在这段代码中第一个Test方法实际上只实现了IA.Test而如果将第二个Test方法去掉则第一个方法就会同时实现两个Test即IA.Test和IB.Test。不妨自己动手去试一下。5、同一个类型也只能实现同一个接口一次。其实不论类型的父类重复实现了同一个接口多少次一个类型只能实现一个接口一次。考虑下面的代码public interface ITest { void Test(); } public abstract class Test1 : ITest { public void Test() { throw new NotImplementedException(); } } public abstract class Test2 : Test1, ITest { public new void Test() { throw new NotImplementedException(); } } public abstract class Test3 : Test2, ITest { public new void Test() { throw new NotImplementedException(); } }无论在基类中实现了多少次ITest接口事实上在ITest3的接口列表中永远只有一个ITestGetInterfaces也只能对ITest的每个成员实现一次隐式或显式。6、实现接口的成员实际可见性总是不低于接口可见性。显示实现接口的成员可见性总是等同于接口可见性因为它们默认都是private的。重写基类成员的成员必须有相同的可见性接口则不必隐式实现总是要求成员必须为public。同时一个类型可以实现可见性比自己高或低的接口但不能继承可见性比自己低的基类。因为能访问到接口的类型的地方一定能访问到接口的实现成员所以实现接口的成员的实际可见性总不低于接口。一个很常见的手法一个可见性较低的类型通过可见性高的接口来暴露自己的成员事实几乎所有的枚举器IEnumerator的实例都是private的类型透过接口来暴露功能。