首页 新闻 会员 周边

C#通过覆盖基类的函数来实现类似订阅处理

0
悬赏园豆:10 [已解决问题] 解决于 2022-11-13 13:58

前两天项目中用到了声网的sdk,其中我通过自定义类继承自声往的IAgoraRtcEngineEventHandler类后,覆盖这个基类的一些方法实现了sdk通知我的功能,请问这中是观察者模式吗,又有点类似event的发布订阅,不太明白这种是怎么实现的

代码如下

复制代码
 1 public class RTCEventHandler : IAgoraRtcEngineEventHandler//声网的类
 2 {
 3     OnJoinChannelSuccess()
 4     {
 5         //自己的事情
 6     }
 7   
 8   OnError()
 9     {
10     }
11     
12 }    
复制代码

我通过覆盖父类方法进行对sdk回调的处理

屋檐不懂雨的主页 屋檐不懂雨 | 初学一级 | 园豆:27
提问于:2022-10-15 16:37
< >
分享
最佳答案
0

如果声网的命名是规范的,IAgoraRtcEngineEventHandler是一个接口,而不是一个类。你实现了这个接口要求你实现的函数OnJoinChannelSuccess。那么,当你实例化一个对象RTCEventHandler rtc后传给框架,框架不知道你的rtc是什么类的实例,但是它知道rtc实现了IAgoraRtcEngineEventHandler,所以,可以将它转为IAgoraRtcEngineEventHandler类型,然后调用OnJoinChannelSuccess即可。

收获园豆:10
ensleep | 小虾三级 |园豆:1682 | 2022-10-17 08:33

F12跳转后,查看sdk是个抽象类

 

屋檐不懂雨 | 园豆:27 (初学一级) | 2022-10-17 09:54

 我确实实例化了一个RTCEventHandler的实例传给了框架

屋檐不懂雨 | 园豆:27 (初学一级) | 2022-10-17 09:57

@屋檐不懂雨: 根据你贴出来的这个新的版段,可以看见IAgoraRtcEngineEventHandler不是一个接口,而是一个抽象类,抽象类和接口的功能是一样的。

ensleep | 园豆:1682 (小虾三级) | 2022-10-17 12:45

@ensleep: 请教一下,能方便展示一下伪代码吗

屋檐不懂雨 | 园豆:27 (初学一级) | 2022-10-17 12:54

@屋檐不懂雨:
public class caller{
IAgoraRtcEngineEventHandler rtc;
public void setEventHandler(IAgoraRtcEngineEventHandler rtc){
this.rtc=rtc;
}
public void Call(){
rtc.OnWarning(1,"test form warning");
}
}

ensleep | 园豆:1682 (小虾三级) | 2022-10-17 14:07

@ensleep: 请问在父类中是怎么调用子类的同名方法,因为子类是override覆盖方法用的,应该不是你代码中指定调用某个方法

屋檐不懂雨 | 园豆:27 (初学一级) | 2022-10-20 10:23

@ensleep: 子类想覆盖,父类的方法必须要是virtual或abstract修饰的

屋檐不懂雨 | 园豆:27 (初学一级) | 2022-10-20 10:24

@屋檐不懂雨: 我写的caller,是容器类,或者是框架类,而并非你的父类。所以,与“子类想覆盖,父类的方法必须要是virtual或abstract修饰的”有什么关系呢?
另外”请问在父类中是怎么调用子类的同名方法“,这个不存在在父类中怎么调用的说法,你的父类不论是接口还是抽象类,都不存在实例,对于一个不存在的实例,它怎么可能在内部调用什么方法呢?

ensleep | 园豆:1682 (小虾三级) | 2022-10-20 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册