1

我经常发现自己这样做:

class MyClass
{
    public MyClass(int x)
    {
        this.x = x;
    }        
    private int x;

    ...
}

每次我添加一个新的私有成员变量进行配置时,我都需要将它添加到构造函数的参数列表中,添加到构造函数体中,并作为成员添加到类中。是否有一个很好的编程模式来避免额外的输入?

4

2 回答 2

2

一般来说,如果你用一堆必须传递给构造函数的私有成员来实例化一个类,那么你已经在做一些有问题的事情了。

MyClass myClass = new MyClass(x, y, z, 7, 'c', someOtherClass)

如果合适,您可以将相关字段封装到结构或不同的类中,如下所示

class MyClass
{
    public MyClass(Coordinates coords)
    {
        this.coords = coords;
    }
    private Coordinates coords;

}

public struct Coordinates
{
     public int X{get; set;}
     public int Y{get; set;}
     public int z{get; set;}
}

然后你可以用它来实例化它

MyClass myClass = new MyClass(new Coordinates() { X = 1, Y = 2, Z = 3 });

如果没有特定的实现,很难确定最佳解决方案,但如果您实际上不必从类外部设置字段,您可以执行类似的操作

class MyClass
{
    public MyClass()
    {

    }        
    private int x = 2;

    ...
}

或者

class MyClass
{
    public MyClass()
    {
        this.x = 2;
    }        
    private int x;

    ...
}
于 2013-03-13T17:26:22.030 回答
0

我发现我可以滥用继承来实现我的目标。我设置了一个“Loader”子类,它的唯一目的是插入基类的依赖项。然后我们可以使用基类并忘记加载器。

再说一次,这有一个可怕的副作用,就是阻止在基本构造函数中使用这些受保护的成员变量——我们需要使用 .Start() 函数或类似的东西。所以,这是一个非常糟糕的解决方案,虽然节省了一些击键。

public class MyClass
{
    protected int param1;
    protected int param2;

    public void DoStuff()
    {
        Console.WriteLine(param1 + param2);
    }
}


public class MyClassLoader : MyClass
{
    public MyClassLoader()
    {
        param1 = 1;
        param2 = 2;
    }
}

class Program
{
    static void Main(string[] args)
    {

        MyClass myObj = new MyClassLoader();
        myObj.DoStuff();

        Console.WriteLine("Press any key to quit.");
        Console.ReadKey();
    }
}
于 2013-03-14T18:49:19.850 回答