2010-03-24 112 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