2010-03-24 113 views
1

我有以下問題。
我有一類「Instellingen」這是在其他3類轉換類型

public class Instellingen 
    { 
     private int _ID; 
    } 
    public class Class1: Button 
    { 
     private Instellingen _Instellingen; 
    } 
    public class Class2 : Label 
    { 
     private Instellingen _Instellingen; 
    } 
    public class Class3 : TextBox 
    { 
     private Instellingen _Instellingen; 
    } 

如果我有另一個類的字段,即使用其他類(但它可以是這3類人) 我必須使用開關嗎?還是有更簡單的方法?

public class AnotherClass 
    { 
     public AnotherClass() 
     { 
      GetInstellingenFromClass(new Class1()); 
      GetInstellingenFromClass(new Class2()); 
      GetInstellingenFromClass(new Class3()); 
     } 
     private void GetInstellingenFromClass(Control c) 
     { 
      switch (c.GetType.ToString()) 
      { 
       case "Class1": 
        Class1 klasse = (Class1) c; 
        //Do something with the _Instellingen of this class 
        break; 
       case "Class2": 
        Class2 klasse2 = (Class2) c; 
        //Do something with the _Instellingen of this class 
        break; 
       case "Class3": 
        Class3 klasse3 = (Class3)c; 
        //Do something with the _Instellingen of this class 
        break; 

      } 
     } 
    } 

(不存在的東西,所以我可以做類似c._Instellingen? - >沒有首先將其轉換爲正確的類型,在那裏不管什麼類型c是)

我希望你能理解我的問題。

謝謝

回答

5

您應該製作一個interface,它具有Instellingen屬性並在三個類中實現它。

例如:

interface IHasInstellingen { 
    Instellingen Instellingen { get; } 
} 

public class Class1: Label, IHasInstellingen { 
    public Instellingen Instellingen { get; private set; } 
} 
public class Class2: Button, IHasInstellingen { 
    public Instellingen Instellingen { get; private set; } 
} 


private void GetInstellingenFromClass(IHasInstellingen c) { 
    Instellingen ig = c.Instellingen; 
    //Do things... 
} 
//Alternatively: 
private void GetInstellingenFromClass(Control c) { 
    IHasInstellingen hi = c as IHasInstellingen; 
    if (hi == null) 
     return;  //Or throw an ArgumentException 

    Instellingen ig = hi.Instellingen; 
    //Do things... 
} 
+0

在這種情況下,因爲它們都份額相同的功能,並以同樣的方式實現它......不會的抽象基類更有意義? – 2010-03-24 13:36:22

+0

由於他的方法需要一個'Control',我假設他們不一定是所有的標籤。 – SLaks 2010-03-24 13:37:40

+0

但他檢查c.GetType以查看它是否與他的一個自定義類型相匹配。它只處理所有從Label開始繼承的Class1,Class2和Class3類型的調用。我看到你在說什麼。 – 2010-03-24 13:40:22

1

Polymorphism。在你的情況下,所有的類擴展Label,所以你可以有Label定義Instellingen

public class Label 
{ 
    public Instellingen Instellingen 
    { 
     get { return ...; } 
    } 
} 

然後AnotherClass可以只是Label的工作:

private void GetInstellingenFromClass(Label l) 
    { 
     var instellingen = l.Instellingen; 

     // do something with instellingen here 
    } 

當然,如果你沒有自己Label類,你總是可以繼承它並使用你的類。另一個選擇是定義一個與該屬性的接口,並且具有依賴於該接口的AnotherClass

0

而不必每個三班從標籤中獲得,您可以創建一箇中間基類,像LabelWithInstellingen的?

+0

所以你的意思是Instellingen:標籤和比Class1:Instellingen? – Ruben 2010-03-24 13:36:03

0

考慮使用接口在需要它們的類中公開Instellingen屬性。

class Instellingen 
{ 
    public int ID { get; set; }; 
} 
interface IHasInstellingen 
{ 
    Instellingen Instellingen { get; set; } 
} 

class MyLabel: Label, IHasInstellingen 
{ 
    public Instellingen Instellingen { get; set; } 
} 
class MyButton: Button, IHasInstellingen 
{ 
    public Instellingen Instellingen { get; set; } 
} 

class AnotherClass 
{ 
    public AnotherClass() 
    { 
     GetInstellingenFromClass(new MyLabel()); 
     GetInstellingenFromClass(new MyButton()); 
     // ... 
    } 
    private void GetInstellingenFromClass(IHasInstellingenc) 
    { 
     Console.WriteLine(c.Instellingen.ID); 
     // ... Do something with Instellingen 
    } 
} 
1

不,您不必使用開關。其實Interface這個概念就是你要找的。就像是;

public interface IIntelingenProvider 
{ 
    Intelingen Item {get;} 
} 

public class Class1: Label, IIntelingenProvider 
{ 
    private Instellingen _Instellingen; 
    public Intelingen Item { get { return _Instellingen; } } 
} 

public class Class2: Label, IIntelingenProvider 
{ 
    private Instellingen _Instellingen; 
    public Intelingen Item { get {return _Instellingen; } } 
} 

而你要提供給GetInstellingenFromClass方法的類型是IIntelingenProvider。因此,你可以把它寫成;

private void GetInstellingenFromClass(IIntelingenProvider c) 
    { 
     // regardless of the type, they all have an Item property of type Intelingen 
     // c.Item 
    } 

我建議你閱讀和了解InteritancePolymorphism

+0

您的語法錯誤。 (接口沒有訪問修飾符) – SLaks 2010-03-24 13:46:29

+0

謝謝,SLaks。更正 – tafa 2010-03-24 14:26:29