c#接口和第三方类构造的问题
我正在尝试与DX类接口,并得到构造错误c#接口和第三方类构造的问题,c#,interface,C#,Interface,我正在尝试与DX类接口,并得到构造错误 public interface IDevice { } class vJoystick : Joystick, IDevice { //ERROR Joystick does not take 0 parms... public vJoystick( Joystick joystick) {} } class vMouse : Mouse, IDevice { //ERROR Mouse does not take 0 parms.
public interface IDevice
{
}
class vJoystick : Joystick, IDevice
{ //ERROR Joystick does not take 0 parms...
public vJoystick( Joystick joystick) {}
}
class vMouse : Mouse, IDevice
{ //ERROR Mouse does not take 0 parms...
public vMouse( Mouse mouse ) { }
}
public class DeviceFactory
{
public static IDevice Create( object device, DirectInput di, Guid g )
{
if ( device is Joystick ) return new vJoystick( new Joystick(di, g) );
if ( device is Mouse ) return new vMouse( new Mouse ( di ));
return new vJoystick( new Joystick( di, g ) );//defult
}
}
见上面的评论。如何使我的类传递用于类构造的参数
这也是一个很好的用法,看起来像是过度杀戮
Joystick device = ( Joystick ) DeviceFactory.Create( ( Joystick ) new Object(), directInput, deviceGuid );
更新:根据下面的建议添加此项
class vJoystick : IDevice, Joystick
{
private Joystick joystick;
public vJoystick( DirectInput di, Guid g )
{
joystick = new Joystick(di,g);
}
}
class vMouse : IDevice, Mouse
{
private Mouse mouse;
public vMouse( DirectInput di)
{
mouse = new Mouse( di);
}
}
如果您真的需要继承(我不太相信是这样),请尝试以下方法:
public interface IDevice
{
}
class vJoystick : Joystick, IDevice
{
public vJoystick(DirectInput di, Guid g) : base(di, g) {}
}
class vMouse : Mouse, IDevice
{
public vMouse( DirectInput di ) : base(di) { }
}
public class DeviceFactory
{
public static IDevice Create( object device, DirectInput di, Guid g )
{
if ( device is Joystick ) return new vJoystick(di, g);
if ( device is Mouse ) return new vMouse(di);
return new vJoystick(di, g);//defult
}
}
基本上,由于您是从操纵杆
派生操纵杆
,因此基本(di,g)
有效地执行与新操纵杆(di,g)
相同的操作。不能从C#中的基类型创建派生类型的实例(即扩展它)
另外,如果您想使用.NET中的DX,我建议您使用.NET的工作托管包装,例如SlimDX或SharpDX。你会节省很多时间,除非你非常清楚自己在做什么,否则它也会显著提高你的表现。更不用说降低内存泄漏和其他有趣的事情的发生率:)您是否尝试过添加一个空/默认构造函数?您的意思是像public vmagnage(){}?这给了我同样的错误。错误消息意味着基类,即
操纵杆
和鼠标
,没有空的默认构造函数。除非您使用专门调用基类的构造函数,否则编译器将自动调用基类的默认构造函数,如果没有,则会抱怨。此外,您的构造函数也有点奇怪。它们可能是有意义的,但请重新考虑您是否真的想让您的类既继承自(w.l.o.g.)操纵杆
,又将操纵杆
实例作为构造函数参数。您混淆了继承和封装。如果继承,则需要显式调用基本构造函数,因为它没有默认构造函数。如果封装它,则需要一个类型为maggage的私有变量。将操纵杆参数传递给构造函数只有在封装它时才有意义。如果有帮助的话,我使用的是SharpDx。我会试试这个代码,看看它是否对我有帮助。使用上面的代码并没有像你预期的那样有效。使用IDevice device=DeviceFactory后失败。创建((鼠标)新对象(),directInput);代码可以工作,但我的新IDevice没有继承的成员。@SeanGreen嗯,在您的代码中,IDevice
没有成员<代码>虚拟操纵杆正在实现(而不是继承)虚拟操纵杆
接口,即,如果您有一个虚拟操纵杆
变量,其中包含对虚拟操纵杆
的引用,它将调用虚拟操纵杆
上的方法。但是,首先必须在IDevice
界面中定义该方法。接口不会根据您提供给它的特定实例而“增长”。你为什么还要别的?你想达到什么目标?也许你应该看看接口是用来做什么的。那么我恐怕我在这里又走错了路。我需要IDevice具有许多含义(又名多态性)。因此,我可以在顶级级别将设备定义为IDevice,并允许在3个论坛(操纵杆、鼠标、键盘)之一中构建它。此外,新表单必须从其类继承,以便我可以访问其成员。这在c#中是如何处理的?@SeanGreen似乎是这样。IDevice
值可以有不同的含义,但必须将其显式转换为例如vgoodge
,以获得所需的功能。如果您在所有设备上都有一些通用功能,您可以在IDevice
接口中简单地定义它们,并在各种vXXX
类中实现它们。然后您可以直接调用IDevice
references上的方法,就是这样。您熟悉哪种语言以您期望的方式处理接口?