C与Java的接口实现差异

C与Java的接口实现差异,java,c#,xamarin,xamarin.android,Java,C#,Xamarin,Xamarin.android,我已经为一个java库创建了一个绑定,它是一个扫描仪(型号为Honeywell Dolphin CT50)SDK的一部分。然而,我的理解有点陈词滥调 下面的例子是用Java给出的。Create方法需要一个接口实现。但是,我不知道有类似的方法可以重写接口的“onCreated”方法,同时仍然访问类范围的变量。这是我遇到的问题,如何在C#中执行以下操作 爪哇: 在.NET中,编译器不会执行上述操作,而是以匿名类型实现接口,因此我必须实现接口。但是,如何分配类范围的变量 我的C#: 必须将外部类实例传

我已经为一个java库创建了一个绑定,它是一个扫描仪(型号为Honeywell Dolphin CT50)SDK的一部分。然而,我的理解有点陈词滥调

下面的例子是用Java给出的。Create方法需要一个接口实现。但是,我不知道有类似的方法可以重写接口的“onCreated”方法,同时仍然访问类范围的变量。这是我遇到的问题,如何在C#中执行以下操作

爪哇:

在.NET中,编译器不会执行上述操作,而是以匿名类型实现接口,因此我必须实现接口。但是,如何分配类范围的变量

我的C#:


必须将外部类实例传递给构造函数:

class test
{
    private static BarcodeReader barcodeReader;
    private AidcManager manager;

    public virtual void onCreate(Bundle savedInstanceState)
    {
        // create the AidcManager providing a Context and a
        // CreatedCallback implementation.
        AidcManager.create(this, new CreatedCallbackAnonymousInnerClass(this));
    }

    private class CreatedCallbackAnonymousInnerClass : CreatedCallback
    {
        private readonly test outerInstance;

        public CreatedCallbackAnonymousInnerClass(test outerInstance)
        {
            this.outerInstance = outerInstance;
        }

        public override void onCreated(AidcManager aidcManager)
        {
            outerInstance.manager = aidcManager;
            barcodeReader = outerInstance.manager.createBarcodeReader();
        }
    }
}

您可以创建一个回调实现
CreateCallback
,该实现将另一个回调作为构造函数参数
successAction
。此传递的回调
OnManagerCreated
将在
CreateCallback
OnCreated
中调用

重要提示:如果实现Java接口,则必须从
Java.Lang.Object
继承。不要自己执行
Handle
Dispose()

活动

public class MyActivity : Activity 
{
    private static BarcodeReader _barcodeReader;
    private AidcManager _manager;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        CreateCallback callback = new CreateCallback(OnManagerCreated) {  };
        AidcManager.Create(this, callback);
    }

    private void OnManagerCreated(AidcManager manager)
    {
        _manager = manager;
        _barcodeReader = manager.CreateBarcodeReader();
    }
}
回调实现

public class CreateCallback : Java.Lang.Object, AidcManager.ICreatedCallback
{
    private Action<AidcManager> _successAction;
    public CreateCallback(Action<AidcManager> successAction)
    {
        _successAction = successAction;
    }

    public void OnCreated(AidcManager p0)
    {
        _successAction(p0);
    }
}

所以,澄清一下,您知道如何在Java中实现这一点,并且正在询问如何在C#中实现这一点?这一点很好。我会编辑。我想知道如何在C中做到这一点,C没有匿名类。您必须将要捕获的参数传递给子类的构造函数。我对C#语法不是百分之百的了解,但我相信语法
newcreatecallback(){}
the
{}
是一个初始值设定项列表。如果接口由单个方法组成,那么在C#中更自然的方法是通过委托而不是接口。这并不能解决问题,但可能有助于避免与以下语句相关的未来问题:不应该让对象实例为静态成员赋值,因为这可能会导致混淆(哪个对象是最后一个为其赋值的对象?)。为什么条形码阅读器是静态的?谢谢!这很有帮助
public class MyActivity : Activity 
{
    private static BarcodeReader _barcodeReader;
    private AidcManager _manager;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        CreateCallback callback = new CreateCallback(OnManagerCreated) {  };
        AidcManager.Create(this, callback);
    }

    private void OnManagerCreated(AidcManager manager)
    {
        _manager = manager;
        _barcodeReader = manager.CreateBarcodeReader();
    }
}
public class CreateCallback : Java.Lang.Object, AidcManager.ICreatedCallback
{
    private Action<AidcManager> _successAction;
    public CreateCallback(Action<AidcManager> successAction)
    {
        _successAction = successAction;
    }

    public void OnCreated(AidcManager p0)
    {
        _successAction(p0);
    }
}
public class MyActivity : Activity, AidcManager.ICreatedCallback 
{
    // ...
}