问题:我目前有一个类,它接受一个Control类型的对象并做一些工作。我试图创建一个可以接受Control,Button或Label对象的类。我可以使这项工作,但它将涉及我复制和粘贴类两次。一个使用Buttons,另一个使用Labels。除了Type之外,被调用的逻辑和成员完全相同。我已经简化了我希望在下面传达的概念:
// This class currently only does work on a Control object
public class takeControlType
{
public takeControlType(Control control)
{
string objectName = control.Name.ToString();
}
}
我可以复制粘贴上面的代码并通过重载类构造函数使其工作:
public class takeAnyType
{
public takeAnyType(Control control)
{
string objectName = control.Name.ToString();
}
public takeAnyType(Button button)
{
string objectName = button.Name.ToString();
}
public takeAnyType(Label label)
{
string objectName = label.Name.ToString();
}
}
我是否认为这只是生产力的拖累?我希望尽管Type不同,我可以重用相同的逻辑,因为我需要替换的唯一项目是Type。我的类中实现的逻辑和属性与控件,按钮和标签完全相同。我已经研究过泛型,但由于我提取了特定于Control,Button或Label的属性和方法,我似乎无法使用泛型来处理对象属性,例如例如.Name或.Width或.Capture。泛型类型为我提供的唯一方法是
我需要访问我之前提到的一些属性。如何实现这一点,以便我可以避免复制/粘贴构成我的类的266行代码,这些代码目前只能用于Control对象?
除了试图使用Generics之外,我还试图看看我是否可以使用基类型对象而不是Control,但这导致了我目前与Generics相同的问题。我无法再访问与控件,按钮和标签相关联的成员。
要清除任何混淆,下面的示例(非工作)代码是我试图完成的。
public class takeAnyType
{
public takeAnyType(anyType obj)
{
string objectName = obj.Name.ToString();
obj.Cursor = Cursors.SizeNESW;
obj.Capture = true;
obj.Width = 20;
obj.Top = 100;
}
}
答案 0 :(得分:3)
Button
和Label
类继承自Control
(间接)。这意味着,如果您只为Control
创建一个类,则仍可以将其用于Button
或Label
类型的对象。你不必为那些人创建特殊的课程。
在C#(和一般的OO语言)中,您可以将派生类的实例分配给超类的变量。例如,这是有效的C#代码:
Control control = new Button();
答案 1 :(得分:0)
答案解决了您的示例,但您的问题似乎更多地描述了一些内容 - 在for(var child=element.firstChild; child!==null; child=child.nextSibling) {
console.log(child);
}
和Label
上进行更复杂的登录。一种方法是:
1)声明一个基类来处理常见问题(例如你的名字例子)
2)为每个Button
和Label
声明一个类来处理特定的逻辑
Button