问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C#接口使用完全指南:从基础到高级特性

创作时间:
作者:
@小白创作中心

C#接口使用完全指南:从基础到高级特性

引用
1
来源
1.
https://www.cnblogs.com/asyaB404/p/18261044

本文对C#接口的使用进行了全面总结,包括基本使用、属性、事件、默认实现、显式实现以及多个接口同名方法的处理等。通过多个示例代码详细解释了C#接口的各种用法,适合C#开发者阅读。

C#的接口(interface)

早期对接口的认识仅限于方法签名的使用,但随着学习的深入,接口的功能越来越接近抽象类。

1.最基本的使用

接口主要用于提供公共方法。以下是一个玩家交互判断的例子:

public interface IPlayerInteraction
{
    void Interact();
}

public class Player : IPlayerInteraction
{
    public void Interact()
    {
        Console.WriteLine("Player is interacting.");
    }
}

接口也支持使用泛型。例如:

public interface IGenericInterface<T>
{
    T Process(T input);
}

public class GenericClass : IGenericInterface<string>
{
    public string Process(string input)
    {
        return input.ToUpper();
    }
}

另外需要注意的是,C#中接口(interface)中的方法默认是public的。如果你不指定任何访问修饰符,接口中的方法隐式地是public。

2.接口上使用属性

接口中的属性定义类似于方法的定义,但接口属性不包含访问器的实现,而是只声明属性的存在。实现接口的类必须提供这些属性的实现。

例如:

public interface INameProvider
{
    string Name { get; set; }
}

public class Person : INameProvider
{
    public string Name { get; set; }
}

3.接口上使用事件

在接口中定义事件类似于定义方法和属性,接口仅声明事件,不包含事件的实现。实现接口的类必须提供这些事件的实现。

例如:

public interface IEventProvider
{
    event EventHandler SomeEvent;
}

public class EventRaiser : IEventProvider
{
    public event EventHandler SomeEvent;

    public void RaiseEvent()
    {
        SomeEvent?.Invoke(this, EventArgs.Empty);
    }
}

4.接口上默认实现

C#8.0开始,接口支持了默认实现,使得接口不仅仅是方法签名的集合,还可以提供实际的方法实现。接口默认实现的引入使得接口的演变更加灵活,同时可以减少破坏性更改。

例如:

public interface IDefaultImplementation
{
    void Fun() => Console.WriteLine("Default implementation");
}

public class MyClass : IDefaultImplementation
{
    // MyClass实例可以直接使用Fun方法
    // 但是需要将对象显式转换为接口类型才能使用默认实现
    public void Test()
    {
        ((IDefaultImplementation)this).Fun();
    }
}

但需要注意,如果在实现类里"重写"了默认方法,那么原来的默认方法将会被彻底覆盖。

5.接口上显式实现

显式接口实现用于解决接口成员命名冲突或隐藏接口成员,使得这些成员只能通过接口引用来访问。

例如:

public interface IDamageable
{
    void Damage(int amount);
}

public interface IScarecrow : IDamageable
{
    void Damaged(int amount);
}

public class Scarecrow : IScarecrow
{
    void IDamageable.Damage(int amount)
    {
        // 稻草人不能攻击,所以这个方法可以留空或抛出异常
    }

    public void Damaged(int amount)
    {
        Console.WriteLine($"Scarecrow was damaged by {amount} points.");
    }
}

显式实现接口的方法不能使用修饰符,因为显式实现的成员在类的实例上是不可见的,它们的访问是通过接口引用来控制的。

6.多个接口的同名方法或属性的处理

当一个类实现多个接口且这些接口包含同名的属性或方法时,可以通过显式接口实现来解决命名冲突。这种方式允许一个类为每个接口提供单独的实现,从而避免冲突和歧义。

例如:

public interface INumProvider1
{
    int Num { get; set; }
}

public interface INumProvider2
{
    int Num { get; }
}

public class MyClass : INumProvider1, INumProvider2
{
    int INumProvider1.Num
    {
        get => this.num;
        set => this.num = value;
    }

    int INumProvider2.Num => this.num;

    private int num;
}

需要注意的是,如果两个接口的属性访问器不同,就得取两个访问器的并集。例如:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号