将接口作为参数传递
本文关键字:参数传递 接口 | 更新日期: 2023-09-27 18:27:53
我阅读了以下用Java编写的altbeacon的示例(http://altbeacon.github.io/android-beacon-library/samples.html)。我必须把代码翻译成c#。。
@Override
public void onBeaconServiceConnect() {
beaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
Log.i(TAG, "I just saw an beacon for the first time!");
}
@Override
public void didExitRegion(Region region) {
Log.i(TAG, "I no longer see an beacon");
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
}
});
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));
} catch (RemoteException e) { }
}
我开始是这样的,现在我在传递接口参数时遇到了一个问题,就像上面提到的例子一样。。
public void OnBeaconServiceConnect()
{
beaconManager.SetMonitorNotifier(...)
}
有人能解释一下如何把代码翻译成c吗?
我认为您真正的问题是"C#中是否存在与匿名类等价的类?"。答案是否定的。
看看Java:Interface中的new关键字,这怎么可能呢?。Java支持定义在方法中实现接口的匿名类。它只是语法上的糖(或盐,取决于人们对这个特性的看法),而不是定义一个隐含接口的私有类。
因此,当将此代码转换为C#时,解决方案是创建一个私有内部类,并在方法中使用它:
class SomeClass
{
...
public void OnBeaconServiceConnect()
{
beaconManager.SetMonitorNotifier(new MonitorNotifier());
...
}
...
private MonitorNotifier : IMonitorNotifier
{
public void didEnterRegion(Region region)
{
Log.i(TAG, "I just saw an beacon for the first time!");
}
public void didExitRegion(Region region)
{
Log.i(TAG, "I no longer see an beacon");
}
public void didDetermineStateForRegion(int state, Region region)
{
Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
}
}
}
匿名类不能在C#中实现接口。所以不要在这里使用匿名类:
public class MyMonitorNotifier : MonitorNotifier {
...
}
然后:
beaconManager.SetMonitorNotifier(new MyMonitorNotifier ());