将接口作为参数传递

本文关键字:参数传递 接口 | 更新日期: 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 ());