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