只需几个不同的参数即可减少很长的构造函数重载次数

时间:2013-02-16 11:25:10

标签: c# parameters constructor

我制作了自定义界面系统,它使用基本的UI控件,如按钮,标签等。有些控件有很多选项,因此它们使用长构造函数,它们只有一个或两个参数不同。这是正在进行的工作,所以我经常更改可选参数,并且需要花费一些时间将更改应用于所有构造函数。

public Button(string Text, Rectangle Rect, Texture2D Texture, bool moreStuff)
public Button(string Text, Point Position, Texture2D Texture, bool moreStuff)
public Button(string Text, Vector2 Position, Texture2D Texture, bool moreStuff)

我尝试使用dynamic关键字代替RectanglePointVector2来减少构造函数的数量,并且它编译,工作,并且目前似乎没问题。但也许我错过了一些可能会在以后破坏这种方法的东西?

要查看dynamic Position传递的内容,我会检查.GetType().Name,如果它不是可识别的类型,请使用开关并在default:处抛出异常。

这样做是否可以,或者是否有更好(更安全或更合适)的方式?


目前可以创建Button内联的完全自定义的实例,我不想失去这种能力。

5 个答案:

答案 0 :(得分:3)

如果你觉得它很乏味,你不需要定义构造函数参数。你可以很好地使用对象初始化器:

SomeButton button = new SomeButton()
{
    Text = "",
    MoreStuff = false
};

答案 1 :(得分:1)

这需要parameter object。这是一个每个参数都有一个属性的类。您的Button构造函数现在只接受一个参数:该参数对象。

使用dynamic来减少重载次数绝对不是正确的方法。

答案 2 :(得分:0)

在您的方案中使用dynamic并不合适。具有不同的构造函数重载并不是一件坏事(不值得滥用dynamic关键字)。 .NET Framework BCL中的许多类都有几个构造函数重载(例如,FileStream类有15个contstructors),有些方法有几个重载用于不同的用法(例如MessageBox.Show)。

答案 3 :(得分:0)

另一种方法是自己输入:

class YourPositioningType {
    public int X { get; set; }
    public int Y { get; set; }

    public static YourPositioningType FromVector(Vector2 vector) {
        return new YourPositioningType() { X = vector.X, Y = vector.Y };
    }

    public static YourPositioningType FromRectangle(Rectangle rect) {
        // etc..
    }
}

从上述每种类型转换的静态方法。然后你会把它称为:

Button b = new Button("Blah", YourPositioningType.FromVector(new Vector2() { /* etc */));

然后你只需在一个构造函数中使用上面的类。

答案 4 :(得分:0)

如果您使用对象初始值设定项,则可以单独设置所需的每个属性。您必须要小心,可以独立初始化各种属性。

例如:

public class Button
{
    public int Width
    {
        get
        {
            return Rectangle.Width;
        }
        set
        {
            Rectangle.Width = value;
        }
    }

    public int Height
    {
        get
        {
            return Rectangle.Height;
        }
        set
        {
            Rectangle.Height = value;
        }
    }

    public int X
    {
        get
        {
            return Rectangle.Left;
        }
        set
        {
            Rectangle.Left = value;
        }
    }

    public int Y
    {
        get
        {
            return Rectangle.Top;
        }
        set
        {
            Rectangle.Top = value;
        }
    }

    public Rectangle Rectangle
    {
        get;
        set;
    }
}

如果你有类似上面的课程,你可以这样做:

var button = new Button
{
    Rectangle = new Rectangle(...)
}

或:

var button = new Button
{
    Left = 0,
    Top = 0,
    Width = 100,
    Height = 20
}

对象初始值表示法非常适合通过其属性初始化对象,您可以在其中设置多个需要设置的属性组合。