2014-02-28 37 views
2

我對c#很陌生,我正在練習多態。我想要做的是讓一個設備成爲三種類型之一(遊戲杆,鼠標或鍵盤)。我認爲最好的方法是使用一個類和虛擬。這裏的佈局有問題嗎?c中的多態覆蓋問題#

namespace HID 
{ 
    public class HIDControl 
    { 
. 
. 
. 
    class agnosticDevice 
    { 
     private Joystick jDevice; 
     private Mouse jMouse; 
     private Keyboard jKeyboard; 
     public string type; 

     public virtual void device()// no way to return different types? 
     { 
      //if type is mouse return jMouse...ect? 
     } 
    } 
. 
. 
. 
    } 
} 

只是不理解如何做到這一點,或者我可以走了。誰能幫忙?

更多信息,我在這裏使用DX,也許有這方面的規定,但我不知道如何。基本上在我的HIDControl類中,我設置了DX並根據用戶輸入創建了一個設備。此輸入可能稍後會更改,我需要更改我的設備。所有設備大部分使用相同的功能。事實上,所有事情都可以視爲遊戲杆。雖然對於某些高級功能,我需要改變類型。我知道我可以做類級別的多態,但如此多的類將是多餘的。

另一個直接的解決方案就是在我的班級製作3個設備,但如果我這樣做,我需要3個if語句用於每個用途,而這只是醜陋的。

我覺得我越來越接近這裏[更新代碼的意見和建議發表評論]但是當我創造我的設備它不是繼承成員的權利。以下是我迄今爲止

public abstract class AgnosticDevice 
    { 
     public abstract void SomeDeviceOperation(); 
    } 

    public class vJoystick : AgnosticDevice, Joystick 
    { 
     public vJoystick(DirectInput di, Guid g){} 
     public override void SomeDeviceOperation() 
     { 
      /* Joystick operation */ 
     } 
    } 

    public class vMouse : AgnosticDevice, Mouse 
    { 
     public vMouse(DirectInput di){} 
     public override void SomeDeviceOperation() 
     { 
      /* Mouse operation */ 
     } 
    } 

    public class vKeyboard : AgnosticDevice, Keyboard 
    { 
     public vKeyboard(DirectInput di , Guid g){} 
     public override void SomeDeviceOperation() 
     { 
      /* Keyboard operation */ 
     } 
    } 

    public class DeviceFactory 
    { 
     public static AgnosticDevice Create(string type, DirectInput di, Guid g) 
     { 
      if (type == "Mouse") 
      { 
       return new vMouse(di); 
      } 
      if (type == "Joystick") 
      { 
       return new vJoystick(di, g); 
      } 
      if (type == "Keyboard") 
      { 
       return new vKeyboard(di, g); 
      } 
      return new vJoystick(di, g);//defult 
     } 
    } 

然後我做

AgnosticDevice device = (vJoystick)DeviceFactory.Create(type, directInput, deviceGuid); 

但設備。(有些DX功能)不可用。

回答

2

這裏你需要的是一個接口。定義這些不同輸入設備之間的通用功能的東西。然後,您可以讓這些類中的每一個都實現該接口,從而以他們所需的任何特定方式執行各種操作。

+0

啊是的,我記得在C#中,THX使用這個詞。我會做一些研究。 –

1

你在做什麼是構圖,而不是多態。你可以有一個抽象類Device和三個專業化實現多態:

public abstract class Device 
{ 
    public abstract void SomeDeviceOperation(); 
} 

public class Joystick : Device 
{ 
    public override void SomeDeviceOperation() 
    { 
     /* Joystick operation */ 
    } 
} 

public class Mouse : Device 
{ 
    public override void SomeDeviceOperation() 
    { 
     /* Mouse operation */ 
    } 
} 

public class Keyboard : Device 
{ 
    public override void SomeDeviceOperation() 
    { 
     /* Keyboard operation */ 
    } 
} 

然後,您可以指定任何類的子類DeviceDevice類型的變量,參數,參數等。例如:

public void DoOperationOnDevice(Device d) 
{ 
    d.SomeDeviceOperation(); 
} 

Device d = new Joystick(); 
d.SomeDeviceOperation(); 
DoOperationOnDevice(new Keyboard()); 
d = new Mouse(); 
+0

基類沒有提供任何實現。你並沒有真正獲得任何東西,而且你正在失去一些東西,通過在這裏使用繼承,而不僅僅是一個接口。 – Servy

+0

@Servy這是真的,但這也是一個非常簡單和人爲的例子。設備可以具有跨子類型共享的實現細節,並且繼承是有用的。如果你只有一種方法而沒有別的,那麼是的,一個接口會更合適。 –

+0

無論您擁有多少種方法,我都沒有看到有一個基類用於常見行爲。這些看起來非常像將會有完全不同實現的概念,但是具有通用的API。接口當然可以有更多的方法。 – Servy

2

下面是一些可能給你一個想法:

創建一個接口或抽象類定義,將您所有的「設備」之間共享功能:

public abstract class AgnosticDevice 
{ 
    // methods ... 
    public virtual void DoStuff() 
    { 
     // something 
    } 
} 

然後使用你更具體的設備:

public class Joystick : AgnosticDevice 
{ 
    // perhaps overwrite DoStuff here ... 
} 

public class Mouse : AgnosticDevice 
{ 

} 

這裏是如何ÿ您可以同時使用(這基本上是多態):

public class DeviceFactory 
{ 
    public static AgnosticDevice Create(string someInput) 
    { 
     if (someInput == "something") 
     { 
      return new Mouse(); 
     } 
     return new Joystick(); 
    } 
} 

在要指定一個行爲,每無關的設備必須有你最好創建一個接口的情況下(它可以沒有實現),例如:

public interface IPluggable 
{ 
    void Disconnect(); 
} 

然後實現它在你的「可插拔」設備之一:

public class Joystick : IPluggable 
{ 
    public void Disconnect() 
    { 
     // awesome 
    } 
} 

從這裏見你可以做魔術如:

// I want you to pass me a pluggable device, I don't care if it's a Joystick or a Mouse 
public static void DoWork(IPluggable pluggableDevice) 
{ 
    try 
    { 
     // something will go wrong ! 
    } 
    catch (Exception ex) 
    { 
     LogException(ex); 

     // all pluggable devices can disconnect, I don't care what you've passed as an argument! 
     pluggableDevice.Disconnect(); 
    } 
} 

這是你可以使用:

public void Test() 
{ 
    DoWork(new Joystick()); 
    DoWork(new Mouse()); 

    // you can do some tests by throwing in a fake device 
    // to simulate behaviors that you expect 
    DoWork(new FakeDevice()); 
} 
+0

這個解決方案對我來說也很有幫助,但是就像下面的那個我仍然看不到如何獲得實際的DX設備?看看你的第三個代碼塊,你說「返回新的鼠標();」這將返回一個新的類公共類Mouse:AgnosticDevice,但我將如何讓新的Mouse類返回dx鼠標? –

+0

@SeanGreen據我所知,你需要根據用戶輸入返回不同的設備,一種方法是定義一個設備*是*的通用抽象術語,然後返回它,這取決於它的類型將以不同的方式行事。我希望我在這裏有所作爲,因爲我懷疑我可能誤解了你的要求,也許你可以給我們提供更多關於你的問題的細節(「更大的圖片」)。 –

+0

我相信你有道理,我擔心我吧;)好吧,我想我會跟着你。如果我能把代碼放在這裏,我可以更好地解釋自己。鼠標是dirrectX類,所以我的新鼠標類(AFAIK)不能具有相同的名稱。我認爲,它需要繼承DX鼠標類。像:公共類vMouse:AgnosticDevice,鼠標 –