据我所知,当链接构造函数时,必须在主构造函数的第一行完成,有人可以解释如何使用下面的代码。 我想链接到所有构造函数,以便除了主构造函数之外它们都可以是私有的。
public class Flight {
int passengers = 0;
int seats = 150;
double maxKgPerPassenger;
private Flight(int passengers) {
this.passengers = passengers;
}
private Flight(int seats) {
this.seats = seats;
}
private Flight(double maxKgPerPassenger) {
this.maxKgPerPassenger = maxKgPerPassenger;
}
public Flight(int passengers, int seats, double maxKgPerPassenger) {
this(passengers);
this(seats);
this(maxKgPerPassenger);
}
}
答案 0 :(得分:3)
构造函数最多可以设置尽可能多的字段或完全构造实例。
您选择一个具有更多参数的构造函数,并在具有较小数量的构造函数中使用它。例如,
public Flight(double maxKgPerPassenger) {
this(0, 0, maxKgPerPassenger); // default, default, maxKgPerPassenger
}
private Flight(int passengers, int seats, double maxKgPerPassenger) {
this.passengers = passengers;
this.seats = seats;
this.maxKgPerPassenger = maxKgPerPassenger;
}
我想链接到所有构造函数,以便除了主构造函数之外它们都可以是私有的。
我建议采取相反的方式。使所有构造函数都使用public
,但是如果你不使用它,则使用全参数构造函数private
。
您尝试采用的方法类似于the builder pattern,其中每个方法都设置一个字段。如果一些论点要长大,你肯定需要看看它。
答案 1 :(得分:2)
为什么要链接构造函数?
在链接构造函数时,必须从构造函数中指定一些默认值,并使用带有更多参数的调用构造函数的参数较少。
你在这里做反过来:
// this array must be declared as global field
public string[] files;
private void Button_OpenFile_Click(object sender, EventArgs e)
{
FolderBrowserDialog OpenFBD = new FolderBrowserDialog();
if (OpenFBD.ShowDialog() == DialogResult.OK)
{
LBX_Files.Items.Clear();
files = System.IO.Directory.GetFiles(OpenFBD.SelectedPath);
foreach (string file in files)
{
LBX_Files.Items.Add(System.IO.Path.GetFileName(file));
}
}
}
private void LBX_Files_SelectedIndexChanged(object sender, EventArgs e)
{
L_ShowContents.Text = File.ReadAllText( files.FirstOrDefault(x => x.Contains(LBX_Files.SelectedItem.ToString())));
}
您确实希望从构造函数中调用所有其他构造函数的参数最多
它没有任何意义,它也无效,因为构造函数可以调用同一个类的其他构造函数。
我想链接到所有构造函数,以便它们都可以是私有的 除主要构造函数外。
事情的工作顺序相反。
实际代码似乎不需要构造函数链接 这个就足够了:
public Flight(int passengers, int seats, double maxKgPerPassenger){
this(passengers);
this(seats);
this(maxKgPerPassenger);
}
假设类客户端可以创建具有两种风格的public Flight(int passengers, int seats, double maxKgPerPassenger){
this.passengers = passengers;
this.seats = seats;
this.maxKgPerPassenger = maxKgPerPassenger;
}
实例:
Flight
参数(仍然使用默认值进行评估)你可以写:
seats
答案 2 :(得分:0)
使默认构造函数为private,以防止构造函数实例化并使用公共静态方法实例化对象。这样您就可以解决构造函数限制。为了增加一点混淆,我通过添加 void 返回类型,使用类名将构造函数转换为普通方法。还要考虑是否真的想要不是Builder模式。
`class foo extends Component {
constructor(props) {
super(props);
this.state = {
isDisabled: true,
textOpacity: 0.1,
text1: '',
text2: '',
};
onTextChange1(text) {
if (text.length > 0 && this.state.text2.length > 0) {
this.setState({isDisabled: false, textOpacity: 1, text1: text});
}
else {
this.setState({isDisabled: true, textOpacity: 0.1, text1: text});
}
}
onTextChange2(text) {
if (text.length > 0 && this.state.text1.length > 0) {
this.setState({isDisabled: false, textOpacity: 1, text2: text});
}
else {
this.setState({isDisabled: true, textOpacity: 0.1, text2: text});
}
}
render() {
return (
<View>
<TextInput onChangeText={(text) => this.onTextChange1(text)} value={this.state.text1}/>
<TextInput onChangeText={(text) => this.onTextChange2(text)} value={this.state.text2}/>
<TouchableOpacity disabled={this.state.isDisabled}>
<Text style={{opacity:this.state.textOpacity}}>Hello World!</Text>
</TouchableOpacity>
</View>
);
}
}