2013-07-25 49 views
1

我認爲標題可能是錯誤的...哈哈..不清楚反正..方法傳遞3種不同的數據類型來做同樣的事情?

我有3種不同的數據類型..

public class data1 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 
    Other vars... 
} 
public class data2 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 
    Other vars different from data1 vars... 
} 

等...

如何創建一個功能在通過這些,然後得到我所需要的功能.. 例內瓦爾..

void Something(var data) 
{ 
    switch (typeof(data)) 
    { 
     case data1: 

     break; 
     case data1: 

     break; 
    } 
} 

這不會工作,顯着..但它絕對舉個例子..

我該怎麼做到這一點?

感謝

+0

你在用什麼方法處理數據?你打算使用'其他變種'嗎? –

+0

'void Something(var data)'不是一個有效的語句。編譯器應該抱怨。 –

回答

7

考慮創建類層次結構,並移動方法東西該層次結構。基類:

public abstract class Data 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 

    public abstract void Something(); 
} 

和兩個派生類數據1數據2

public class Data1 : Data 
{ 
    // Other vars... 

    public override void Something() 
    { 
     // Use base class data and other vars 
    } 
} 

public class Data2 : Data 
{ 
    // Other vars different from Data1 vars 

    public override void Something() 
    { 
     // different implementation 
    } 
} 

現在,當你有這些類的實例,你可以簡單地調用東西上的每個項目,但不嘗試以確定其類型。每個項目將擁有所有必需的變量來完成的動作:

所有的
List<Data> items = // get list of Data1 and Data2 
foreach(Data data in items) 
    data.DoSomething(); 
+1

+1。甚至沒有想過要移動'Something'方法。 -_- –

+1

我認爲這是我想要的..我從來沒有能夠像這樣的東西出來幫忙..謝謝.. –

+1

+1。這顯示了在這種特殊情況下良好的面向對象操作。 –

1

可以使用object代替var

void Something(object data) 
{ 
    if(typeof(data) == data1.GetType()) 
    { 

    } 
    else 
    if(typeof(data) == data2.GetType()) 
    { 

    } 
} 

你的類似乎他們可以使用繼承的公共屬性。創建一個基本的抽象類並繼承它。

public abstract class Data 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 

    public abstract void Something(); 
} 

public class Data1 : Data 
{ 
     //Addition methods go here 
} 

public class Data2 : Data 
{ 
     //Addition methods go here 
} 

作爲一個附加的註釋我假設你將使用符合命名約定的屬性和類等

+0

謝謝,我忽略了這個......哈哈......你會說這是最好的方法嗎? –

1

首先,你可能想利用公共領域重新考慮和使用公共屬性,而不是。你可能會考慮兩個選項。

實現共享接口

同時考慮你的類具有相同的屬性,你可以有一個接口:

public interface IData 
{ 
    Color color {get;set;} 
    int len {get;set;} 
    DrawingVisual dv {get;set;} 
} 

public interface Data1 
{ 
    public Color color {get;set;} 
    public int len {get;set;} 
    public DrawingVisual dv {get;set;} 
} 

public interface Data2 
{ 
    public Color color {get;set;} 
    public int len {get;set;} 
    public DrawingVisual dv {get;set;} 
} 

void Something(IData data) 
{ 
    // use the properties defined in the IData interface 
} 

Something(new Data1()); 
Something(new Data2()); 

使用方法重載

void Something(data1 data) 
{ 
    // Do something specific using data1 class 
} 

void Something(data2 data) 
{ 
    // Do something specific using data2 class 
} 

Something(new data1()); 
Something(new data2()); 

我d建議使用第一個選項。

+0

爲什麼要實施3個相同的合同?只是爲了區分類型?我建議創建抽象類並在@lazyberezovsky所做的每個子類中實現專門的方法。 –

+0

@MechanicalObject它是_one_選項。我不是說這是_ideal_。如果克里斯不能重構課堂,它仍然是一個有效的選擇。 –

+0

這一切都很好..這裏的每一篇文章都會幫助我修復我的課程,以便更好地完成課程。現在,我的東西就像是麪包上的果凍一樣..我想把所有東西都搬到下一步.. –

相關問題