如何将抽象方法作为引用传递?作业中传递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
相关产品推荐
相关产品推荐

