如何更新类代码使其独立

时间:2016-03-06 21:13:54

标签: c# winforms

问题:我目前有一个类,它接受一个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。泛型类型为我提供的唯一方法是

  • 等于()
  • GetHashCode()方法
  • 的GetType()
  • 的ToString()

我需要访问我之前提到的一些属性。如何实现这一点,以便我可以避免复制/粘贴构成我的类的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;
    }
}

2 个答案:

答案 0 :(得分:3)

ButtonLabel类继承自Control(间接)。这意味着,如果您只为Control创建一个类,则仍可以将其用于ButtonLabel类型的对象。你不必为那些人创建特殊的课程。

在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)为每个ButtonLabel声明一个类来处理特定的逻辑

Button