Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#接口和第三方类构造的问题_C#_Interface - Fatal编程技术网

c#接口和第三方类构造的问题

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.

我正在尝试与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 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上的方法,就是这样。您熟悉哪种语言以您期望的方式处理接口?