如何避免构造函数中的私有成员赋值
本文关键字:成员 赋值 何避免 构造函数 | 更新日期: 2023-09-27 18:03:57
我经常发现自己这样做:
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();
}
}