- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在尝试将一些代码从 java 移植到 c# 时遇到了一些麻烦。
首先,对java代码背后的关键概念进行一些解释:现有代码的关键概念是在外部库中导入/使用方法的类。这个类实现了一个接口(interface),它声明了外部库中的大部分方法。好处是能够创建像
这样的实例Interface1 instance = new classImplementingInterface1();
我正在尝试移植实现接口(interface)并从外部库导入方法的代码。实际上,我必须将该接口(interface)转换为抽象类,因为 java 接口(interface)使用包含预定义值的字段,这在 .NET 接口(interface)中实际上是不支持的。
这可能是我的出发点:
public abstract class abstractClassA
{
public abstract int abstractMethodA(int parameter);
}
public class usualClass : abstractClassA
{
[DllImort("ExternalLib.dll")]
public static extern abstractMethodA(int parameter);
}
抽象类用于从实现该抽象类的类中创建实例,只需键入即可
abstractClassA instance = new usualClass();
好的,这就是我想做的,但我发现这行不通,虽然我继承了一个抽象类,但我必须对我想实现的方法使用覆盖语句
public class usualClass : abstractClassA
{
public extern override abstractMethodA(int parameter);
}
这不能与 DllImport 语句结合使用,因为它告诉我使用该语句的方法应同时声明:extern 和 static。添加 override 关键字来实现抽象类是不可能的,因为不能将静态成员声明为 override。所以我想我被困住了:/
但实际上我想创建一个类,命名来自外部库的入口点。但是我希望这个类实现一个接口(interface)/抽象类,以便能够通过键入来创建实现这个接口(interface)/抽象类的类的实例
abstractClassA instance = new usualClass();
我也尝试过使用接口(interface)(但没有烦人的静态预定义字段)来实现这些东西,我发现接口(interface)实现也不能与 DllImport 语句结合使用,编译器说命名方法是静态的,因此不能实现一个接口(interface)方法。这实际上是有道理的,但不是解决我的问题的合适方法。
您有这方面的经验或进一步的想法吗?
最佳答案
正如 C# 编译器所说,方法必须是static extern
。幸运的是 DllImport
具有 EntryPoint
属性,它允许您在 C# 中使用不同的名称(从而避免命名冲突)。例如:
public abstract class AbstractClassA
{
public abstract int AbstractMethodA(int parameter);
}
public class UsualClass : AbstractClassA
{
[DllImport("ExternalLib.dll", EntryPoint = "abstractMethodA")]
static extern int AbstractMethodAImport(int parameter);
public override int AbstractMethodA(int parameter)
{
return AbstractMethodAImport(parameter);
}
}
但是,您的代码没有遵循最佳实践(另外让人恼火的是,这就是您在 Java 中命名事物的方式 - 但在罗马时是罗马人;请阅读 C# 命名约定 ).你真的应该按如下方式实现它:
public abstract class AbstractClassA
{
public abstract int AbstractMethodA(int parameter);
}
public class UsualClass : AbstractClassA
{
public override int AbstractMethodA(int parameter)
{
return NativeMethods.AbstractMethodA(parameter);
}
}
[SuppressUnmanagedCodeSecurity]
internal class NativeMethods
{
[DllImport("ExternalLib.dll", EntryPoint = "abstractMethodA")]
public static extern int AbstractMethodA(int parameter);
}
始终将您的 externs 放在一个类中,您应该调用 NativeMethods
。
关于C#:将 DllImport 与继承相结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820175/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!