You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将抽象方法作为引用传递?作业中传递notify方法至RailwaySignal的疑问

嘿,我来帮你搞定这两个问题!咱们一步步拆解你的需求:

1. 将Notify方法作为引用传递给RailwaySignal

在C#里,要传递方法引用,最常用的方式是委托(比如Action/Func这类预定义委托,或者自定义委托)。假设你的Notify是无参数、无返回值的方法,用Action就完全够用。

给你写个完整的示例代码:

// RailwayUser 类
public class RailwayUser
{
    private string className;

    public RailwayUser()
    {
        // 获取当前实例的运行时类型名称
        className = this.GetType().Name;
    }

    // 你的Notify方法
    public void Notify()
    {
        Console.WriteLine($"Notify方法被调用,来自类:{className}");
    }
}

// RailwaySignal 类
public class RailwaySignal
{
    // 存储方法引用的字段
    private Action _notifyCallback;

    // 通过构造函数接收Notify方法的引用
    public RailwaySignal(Action notifyCallback)
    {
        _notifyCallback = notifyCallback;
    }

    // 触发通知的方法(比如信号变化时调用)
    public void SignalChanged()
    {
        // 安全调用,避免空引用异常
        _notifyCallback?.Invoke();
    }
}

// 使用示例
var railwayUser = new RailwayUser();
var signal = new RailwaySignal(railwayUser.Notify);
signal.SignalChanged(); // 输出:Notify方法被调用,来自类:RailwayUser

如果你的Notify有参数(比如需要传递信号状态),就用对应的泛型委托,比如Action<string>(接受一个字符串参数),只需要调整RailwaySignal的字段和构造函数即可。

2. 在抽象构造函数中确定调用类,Notify方法打印类名

你之前的思路完全正确!因为this.GetType()返回的是对象的运行时实际类型,哪怕RailwayUser是抽象类,子类实例化时,构造函数里的GetType()会返回子类的名称。

给你扩展成抽象类的示例:

// 抽象基类 RailwayUser
public abstract class RailwayUser
{
    protected string className;

    protected RailwayUser()
    {
        // 这里会获取子类的类型名称
        className = this.GetType().Name;
    }

    // 抽象的Notify方法,由子类实现
    public abstract void Notify();
}

// 子类 Train
public class Train : RailwayUser
{
    public override void Notify()
    {
        Console.WriteLine($"Train的Notify被调用,类名:{className}");
    }
}

// 子类 Station
public class Station : RailwayUser
{
    public override void Notify()
    {
        Console.WriteLine($"Station的Notify被调用,类名:{className}");
    }
}

// 使用示例
var train = new Train();
train.Notify(); // 输出:Train的Notify被调用,类名:Train

var station = new Station();
station.Notify(); // 输出:Station的Notify被调用,类名:Station

小提示

  • 不要用StackTrace来获取类名,虽然能实现,但性能开销大,而且在发布模式下可能被优化掉,不如构造时提前存储可靠。
  • 如果RailwaySignal的生命周期比RailwayUser长,要注意内存泄漏问题,可以考虑用WeakReference<Action>来包装方法引用,但一般简单场景下直接传递没问题。

内容的提问来源于stack exchange,提问作者Alexia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:34:00