我经常发现自己这样做:
class MyClass
{
public MyClass(int x)
{
this.x = x;
}
private int x;
...
}
每次我添加一个新的私有成员变量进行配置时,我都需要将它添加到构造函数的参数列表中,添加到构造函数体中,并作为成员添加到类中。是否有一个很好的编程模式来避免额外的输入?
我经常发现自己这样做:
class MyClass
{
public MyClass(int x)
{
this.x = x;
}
private int x;
...
}
每次我添加一个新的私有成员变量进行配置时,我都需要将它添加到构造函数的参数列表中,添加到构造函数体中,并作为成员添加到类中。是否有一个很好的编程模式来避免额外的输入?
一般来说,如果你用一堆必须传递给构造函数的私有成员来实例化一个类,那么你已经在做一些有问题的事情了。
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;
...
}
我发现我可以滥用继承来实现我的目标。我设置了一个“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();
}
}