前两天项目中用到了声网的sdk,其中我通过自定义类继承自声往的IAgoraRtcEngineEventHandler类后,覆盖这个基类的一些方法实现了sdk通知我的功能,请问这中是观察者模式吗,又有点类似event的发布订阅,不太明白这种是怎么实现的
代码如下
1 public class RTCEventHandler : IAgoraRtcEngineEventHandler//声网的类 2 { 3 OnJoinChannelSuccess() 4 { 5 //自己的事情 6 } 7 8 OnError() 9 { 10 } 11 12 }
我通过覆盖父类方法进行对sdk回调的处理
如果声网的命名是规范的,IAgoraRtcEngineEventHandler是一个接口,而不是一个类。你实现了这个接口要求你实现的函数OnJoinChannelSuccess。那么,当你实例化一个对象RTCEventHandler rtc后传给框架,框架不知道你的rtc是什么类的实例,但是它知道rtc实现了IAgoraRtcEngineEventHandler,所以,可以将它转为IAgoraRtcEngineEventHandler类型,然后调用OnJoinChannelSuccess即可。
F12跳转后,查看sdk是个抽象类
我确实实例化了一个RTCEventHandler的实例传给了框架
@屋檐不懂雨: 根据你贴出来的这个新的版段,可以看见IAgoraRtcEngineEventHandler不是一个接口,而是一个抽象类,抽象类和接口的功能是一样的。
@ensleep: 请教一下,能方便展示一下伪代码吗
@屋檐不懂雨:
public class caller{
IAgoraRtcEngineEventHandler rtc;
public void setEventHandler(IAgoraRtcEngineEventHandler rtc){
this.rtc=rtc;
}
public void Call(){
rtc.OnWarning(1,"test form warning");
}
}
@ensleep: 请问在父类中是怎么调用子类的同名方法,因为子类是override覆盖方法用的,应该不是你代码中指定调用某个方法
@ensleep: 子类想覆盖,父类的方法必须要是virtual或abstract修饰的
@屋檐不懂雨: 我写的caller,是容器类,或者是框架类,而并非你的父类。所以,与“子类想覆盖,父类的方法必须要是virtual或abstract修饰的”有什么关系呢?
另外”请问在父类中是怎么调用子类的同名方法“,这个不存在在父类中怎么调用的说法,你的父类不论是接口还是抽象类,都不存在实例,对于一个不存在的实例,它怎么可能在内部调用什么方法呢?