C#接口的一些坑

cs 复制代码
using System;
using LXF_Framework;
using UnityEngine;

public class Test : Card_ATTACK_test
{
    
}



public interface IInit<T, TParam> where T : IInit<T, TParam>
{
    void Set(Action<TParam> action)
    {
        GetEventRunner().Clear();
        GetEventRunner().Register(action);
    }

    void ReSet()
    {
        Debug.Log("Reset");
        GetEventRunner().Clear();
        GetEventRunner().Register(GetDefaultAction());
    }



    EventRunner<TParam> GetEventRunner();
    Action<TParam> GetDefaultAction();
}

public interface IAttack_test : IInit<IAttack_test, (int, BaseCard)>
{
    EventRunner<(int, BaseCard)> OnAttackEvent { get; set; }
    void Attack(int damage, BaseCard card);

    Action<(int, BaseCard)> IInit<IAttack_test, (int, BaseCard)>.GetDefaultAction(){
        Debug.Log("IAttack_test: GetDefaultAction");
        return tuple => Attack(tuple.Item1, tuple.Item2);
     }
        
    EventRunner<(int, BaseCard)> IInit<IAttack_test, (int, BaseCard)>.GetEventRunner(){
        Debug.Log("IAttack_test: GetEventRunner");
        return OnAttackEvent;
    }
}


public abstract class Card_ATTACK_test : CARD,IAttack_test
{
    
    protected override void Start()
    {
        base.Start();
        ((IAttack_test)this).ReSet();
    }
}

public interface IHurt_test : IInitialization<IHurt, int>
{
    EventRunner<int> OnHurtEvent { get; set; }
    void GetHurt(int damage);

    Action<int> IInitialization<IHurt, int>.GetDefaultAction() {
        Debug.Log("IHurt_test: GetDefaultAction");
        return damage => GetHurt(damage);
    }
    EventRunner<int> IInitialization<IHurt, int>.GetEventRunner() {
        Debug.Log("IHurt_test: GetEventRunner");
        return OnHurtEvent;
    }
}


public abstract class CARD :MonoBehaviour, IHurt_test
{
    public EventRunner<int> OnHurtEvent { get; set ; }=new();

    public void GetHurt(int damage)
    {
        
    }

    protected virtual void Start() {
        ((IHurt_test)this).ReSet();
    }

    public EventRunner<(int, BaseCard)> OnAttackEvent { get; set; }=new EventRunner<(int, BaseCard)> ();

  
    public void Attack(int damage, BaseCard card)
    {
        Debug.Log("Attack");
    }
}

运行结果:

说明:当两个接口同时继承自一个基础接口IBASE时,当一个类A实现其中某一个接口IA时,再用其他类B来继承这个类时,类B所实现的所有基础接口IBASE的接口都被失效(被IA覆盖)

当两个接口处于同一级别时,才会正确执行

cs 复制代码
public abstract class CARD :MonoBehaviour, IHurt_test,IAttack_test
cs 复制代码
using System;
using LXF_Framework;
using UnityEngine;

public class Test : Card_ATTACK_test
{
    
}



public interface IInit<T, TParam> where T : IInit<T, TParam>
{
    void Set(Action<TParam> action)
    {
        GetEventRunner().Clear();
        GetEventRunner().Register(action);
    }

    void ReSet()
    {
        Debug.Log("Reset");
        GetEventRunner().Clear();
        GetEventRunner().Register(GetDefaultAction());
    }



    EventRunner<TParam> GetEventRunner();
    Action<TParam> GetDefaultAction();
}

public interface IAttack_test : IInit<IAttack_test, (int, BaseCard)>
{
    EventRunner<(int, BaseCard)> OnAttackEvent { get; set; }
    void Attack(int damage, BaseCard card);

    Action<(int, BaseCard)> IInit<IAttack_test, (int, BaseCard)>.GetDefaultAction(){
        Debug.Log("IAttack_test: GetDefaultAction");
        return tuple => Attack(tuple.Item1, tuple.Item2);
     }
        
    EventRunner<(int, BaseCard)> IInit<IAttack_test, (int, BaseCard)>.GetEventRunner(){
        Debug.Log("IAttack_test: GetEventRunner");
        return OnAttackEvent;
    }
}


public abstract class Card_ATTACK_test : CARD
{
    
    protected override void Start()
    {
        base.Start();
        ((IAttack_test)this).ReSet();
    }
}

public interface IHurt_test : IInitialization<IHurt, int>
{
    EventRunner<int> OnHurtEvent { get; set; }
    void GetHurt(int damage);

    Action<int> IInitialization<IHurt, int>.GetDefaultAction() {
        Debug.Log("IHurt_test: GetDefaultAction");
        return damage => GetHurt(damage);
    }
    EventRunner<int> IInitialization<IHurt, int>.GetEventRunner() {
        Debug.Log("IHurt_test: GetEventRunner");
        return OnHurtEvent;
    }
}


public abstract class CARD :MonoBehaviour, IHurt_test,IAttack_test
{
    public EventRunner<int> OnHurtEvent { get; set ; }=new();

    public void GetHurt(int damage)
    {
        
    }

    protected virtual void Start() {
        ((IHurt_test)this).ReSet();
    }

    public EventRunner<(int, BaseCard)> OnAttackEvent { get; set; }=new EventRunner<(int, BaseCard)> ();

  
    public void Attack(int damage, BaseCard card)
    {
        Debug.Log("Attack");
    }
}

运行结果:

注意事项:

继承自同一基接口的接口不要在类继承中使用以免被覆盖

相关推荐
军训猫猫头2 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
不爱写代码的玉子4 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
开开心心就好7 小时前
高效Excel合并拆分软件
开发语言·javascript·c#·ocr·排序算法·excel·最小二乘法
一名用户8 小时前
unity实现自定义粒子系统
c#·unity3d·游戏开发
钢铁男儿10 小时前
C# 类和继承(扩展方法)
java·servlet·c#
爱炸薯条的小朋友10 小时前
C#由于获取WPF窗口名称造成的异常报错问题
windows·c#·wpf
Rose 使者12 小时前
全球IP归属地查询接口如何用C#进行调用?
c#·api·ip地址
~plus~14 小时前
Harmony核心:动态方法修补与.NET游戏Mod开发
开发语言·jvm·经验分享·后端·程序人生·c#
htj1014 小时前
C# 使用正则表达式
正则表达式·c#
~plus~14 小时前
WPF八大法则:告别模态窗口卡顿
开发语言·经验分享·后端·程序人生·c#