2011-07-31 42 views
0

我想要定義一個接口和類,它們實現瞭如下的接口。接口中定義的方法接受一個字符串作爲參數,其中方法Execute的myClass2實現接受2個不遵循接口定義的參數。定義一個接口中需要n個參數的方法

這就是問題所在。我怎樣才能在一個接口中定義一個方法,該方法需要n個不同類型的參數?

請指教。謝謝。

public interface MyInterface 
{ 
    void Execute(string a); 
} 

public class myClass1 : MyInterface 
{ 
    public void Execute(string a) 
    { 
     Console.WriteLine(a); 
    } 
} 

public class myClass2 : MyInterface 
{ 
    public void Execute(string a, int b) 
    { 
      Console.WriteLine(a); 
      Console.WriteLine(b.ToString()); 
    } 

} 

編輯:我想到另一種方法。我很感激,如果有人能告訴我這是否會是更好的設計。

public interface IParameter 
{ 
    Type ParameterType { get; set; } 
    string Name { get; set; } 
    object Value { get; set; } 
} 

public interface MyInterface 
{ 
    void Execute(Recordset recordSet, List<IParameter> listParams); 
} 

public class MyClass : MyInterface 
{ 
     public void Execute(Recordset recordSet, List<IParameter> listParams) 
     { 

     } 
} 

我通過一個IParameter列表,它包含所有需要發送的參數。

+2

有東西在這裏聞起來。是什麼讓你參與這個設計? –

+1

如果你的類需要一個帶有兩個參數的方法,那麼你的界面也必須具有相同的方法簽名(帶有兩個參數的'Execute')。沒有什麼神奇的方法可以使這裏發生...... –

+0

@David:你可以看看Jon的評論。這會給你一個想法,我想實現。 –

回答

6

如果調用者知道如何調用該方法,如果接口沒有修復參數類型,該如何調用該方法?

最接近你可以是:

public interface MyInterface 
{ 
    void Execute(params object[] args); 
} 

接口的實現必須然後交易與任意數量的參數中,雖然傳遞 - 你不能有一個實現該處理單個int參數,雖然它當然可以拋出異常,如果args包含任何東西以外的其他單個int值。編輯:只是要清楚,這將很少是一個很好的設計。在一些非常弱類型的的情況下,它可能是適當的,但否則,通常這將是值得嘗試找到更好的東西。

如果您可以提供更多關於您要做什麼的信息,我們可能會幫助您更多。

+0

我認爲如果您明確表示使用您提供的代碼很可能不是一個好主意,那麼您的答案會得到改進。您可能會誤導提問者。 –

+0

我正在設計技術指標。即簡單移動平均線,指數移動平均線等。所有指標都將記錄集作爲Mandotary參數。某些指標可能需要一段時間作爲附加參數,其他指標可能需要一些時段和名稱作爲附加參數。我正試圖設計一個通過接口公開方法的插件類型主機。任何人都可以構建自己的指標,這可以成爲主機的插件組件。我可能錯誤地接觸了設計。正如我所說,每個指標有不同的數量和參數類型,可以傳遞給 –

+0

@Alan:是的,我認爲你可能*有*設計錯誤。接口用於將調用者與它所調用的精確事物分離。如果有任何調用者可以調用任何實現,那很好,但在這種情況下,聽起來並非如此。 –

0

你可以用弱類型的方法做到這一點。例如,您可以定義需要的對象數組的接口:

public intrface MyInterface 
{ 
    void Execute(params object[] args); 
} 

而且比你可以用任何參數來調用您的任何具體類:

myClass.Execute("string", 1); 

但在這種情況下,你違反的主要目的接口,繼承和編譯時檢查。

實現這個另一種方式是實現這一目標是封裝在附加的類層次結構的所有參數:

class CommandData 
{ 
    public string StringData {get; set;} 
} 

class ExtendedCommandData : CommandData 
{ 
    public int I {get;set;} 
} 

interface IMyInterface 
{ 
    public void Execute(CommandData commandData); 
} 

class MyClass1 : IMyInterface 
{ 
    pubic void Execute(CommandData commandData); 
} 

class MyClass2 : IMyInterface 
{ 
    // Lets impelment this interface explicitely 
    void IMyInterface.Execute(CommandData commandData) 
    { 
    } 

    void Execute(ExtendedCommandData extendedData) 
    { 
    // now we can access to string and int parameter 
    } 
} 
1

你不能有很好的理由這樣做。接口的不同實現可以互換使用。你提出的設計違反了這個原則。如果你想幫助解決衝突,我想你需要解釋是什麼導致你這個設計。

0

除了@Jon回答:考慮到你正在實現一個接口,所以你是架構師,只是不使用接口,而是使用重載虛擬函數的簡單基類,並且在每個具體類中以一種方式描述它喜歡。

編輯: 我的意思是這樣的:而不是使用接口中聲明的基類,一個僞代碼!

public class MyCoolBase // a base CLASS and not interface 
{ 
    public virtual void Execute(string a) 
    { 
     //empty, or NotImplementedException, base on design decision 
    } 

    public virtual void Execute(double b) 
    { 
     //empty, or NotImplementedException, base on design decision 
    } 
    public virtual void Execute(int a, int b) 
    { 
     //empty, or NotImplementedException, base on design decision 
    } 
} 

public class MyCoolChildOne : MyCoolBase 
{ 
    public override void Execute(string a) 
    { 
     //concrete implementation 
    } 
} 

public class MyCoolChildTwo : MyCoolBase 
{ 
    public override void Execute(int a, int b) 
    { 
     //concrete implementation 
    } 
} 

等等...

壞:當你做這樣的事情在代碼

MyCoolBase myCoolBase = new MyCoolChildOne(); 

myCoolBase...?(); // should be really sure which function you're going to call on this line 

好:你有強大的各類管理,也沒有更多object[]數組,或多個繼承多個接口,你必須重寫,而不是我在這種情況下,你甚至可以避免它,即使我認爲這不是個好主意。

順便說一句,像這裏的極客說,我不認爲你的架構是非常可靠的,應該有一些其他的解決方案。我們試圖找出代碼和問題的最佳選擇,但真正的問題只能知道你。

希望這會有所幫助。

問候。

+0

這怎麼解決問題(根本)?它如何解決它與已經提出的不同之處? –

+0

@merlyn它避免了僅聲明對象數組,而是在基類中鍵入安全的重載函數。 – Tigran

+0

哦。這聽起來像你試圖說「做什麼喬恩做的,但不使用接口 - 使用一個類」。你能提供一個代碼示例嗎?它會清楚你的答案很多。 –

1

所以你定義的接口

public interface MyInterface 
{ 
    void Execute(string a); 
} 

,並試圖實現它作爲

public void Execute(string a, int b) 
{ 
    ... 
} 

這是行不通的 - 你是一個聲明接口,並且試圖定義什麼其他。

什麼可能工作(而且我不能基於你的帖子到目前爲止)是顯式的接口實現 - 也就是說,你的具體對象可以公開一個Execute(string,int)方法並顯式地實現你的接口方法。喜歡的東西

public class myClass2 : MyInterface 
{ 
    public void Execute(string a, int b) 
    { 
     ... 
    } 

    void MyInterface.Execute(string a) 
    { 
     ... 
    } 
} 

這就是說,我會強烈建議您重新考慮這個設計。接口的全部內容是它們將一個通用的編程表面暴露給代碼的其餘部分 - 破壞了合同在代碼氣味方面的臭味。

相關問題