问题:我目前有一个类,它接受一个Control类型的对象并完成了一些工作。我试图创建一个可以接受Control,Button或Label对象的类。我可以完成这项工作,但是这将涉及我再复制和粘贴两次该类。一个用于按钮,另一个用于标签。除了Type之外,逻辑和被调用的成员完全相同。我简化了我想在下面传达的概念:
// This class currently only does work on a Control object
public class takeControlType
{
public takeControlType(Control control)
{
string objectName = control.Name.ToString();
}
}
我可以复制粘贴上面的代码,并通过重载此类的Constructor使其工作,如下所示:
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。我的课程中实现的逻辑和属性与“控件”,“按钮”和“标签”完全相同。我已经研究了泛型,但是由于我要撤回特定于控件,按钮或标签的属性和方法,因此我似乎无法使泛型与对象属性(如.Name或.Width或例如捕获。通用类型为我提供的唯一方法是
等于()
GetHashCode()
GetType()
ToString()
我需要访问前面提到的一些属性。为了避免我不得不避免复制/粘贴构成我的当前只能使用Control对象的类的266行代码,如何做到这一点?
除了尝试使用泛型之外,我还尝试查看是否可以使用基类类型对象而不是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;
}
}
最佳答案
Button
和Label
类从Control
继承(间接)。这意味着,如果仅为Control
创建类,则仍可以将其用于Button
或Label
类型的对象。您不必为此创建特殊的类。
在C#(通常是OO语言)中,可以将派生类的实例分配给超类的变量。例如,这是有效的C#代码:
Control control = new Button();
关于c# - 如何更新类代码以使其与类型无关,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35832659/