我有以下问题。
我有一个班级“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类型无关紧要?)
我希望你理解我的问题。
由于
答案 0 :(得分: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...
}
答案 1 :(得分:1)
Polymorphism。在您的情况下,所有类都会延伸Label
,因此您可以Label
定义Instellingen
:
public class Label
{
public Instellingen Instellingen
{
get { return ...; }
}
}
然后AnotherClass
可以使用Label
s:
private void GetInstellingenFromClass(Label l)
{
var instellingen = l.Instellingen;
// do something with instellingen here
}
当然,如果您不拥有Label
类,您可以始终对其进行子类化并从您的类中使用它。另一种选择是使用属性定义接口,并使AnotherClass
依赖于该接口。
答案 2 :(得分: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
}
我建议您阅读并详细了解Interitance和Polymorphism
答案 3 :(得分:0)
您是否可以创建一个中间基类,而不是像LabelWithInstellingen那样创建一个中间基类?
答案 4 :(得分: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
}
}