假设我的C#程序中有以下基类和派生类:
class BaseClass
{
public BaseClass() { }
public BaseClass(int someVal)
{
// do something here
}
}
class DerivedClass : BaseClass
{
public DerivedClass(string somethingNew)
: base()
{
// do something with the somethingNew varible
}
public DerivedClass(string somethingNew, int someVal)
: base(someVal)
{
// do **THE SAME THING** with the somethingNew varible as in first constructor
}
}
我的问题出现在最终的构造函数中 - 理想情况下,我想要的是能够做一些事情(尽管这不会编译):
public DerivedClass(string somethingNew, int someVal)
: base(someVal)
: this(somethingNew)
{
}
换句话说,同时调用base
和第一个构造函数。
有没有办法做到这一点,或者我只是需要在这种情况下重新编写每个构造函数中的代码?
谢谢!
答案 0 :(得分:2)
不是说这是正确的答案(而且我很想听别人怎么建议我这样做),但我最终做的是创建一个私有的setter方法,构造函数可以按以下方式调用:
class DerivedClass : BaseClass
{
public DerivedClass(string somethingNew)
: base()
{
setVals(somethingNew);
}
public DerivedClass(string somethingNew, int someVal)
: base(someVal)
{
setVals(somethingNew);
}
private setVals(string somethingNew)
{
// do something with the somethingNew varible
}
}
它保存了我必须处理重复代码的问题,似乎是最干净的方法,但是,正如我所说的,我很乐意看到其他人推荐/如果有更好的方法可以做到这一点。
感谢!!!
答案 1 :(得分:1)
您可以使用构造函数中的默认可为空参数值来完成此操作。
class BaseClass
{
public BaseClass(int? someVal = null)
{
if (someVal.HasValue)
{
//Do something here
}
}
}
class DerivedClass : BaseClass
{
public DerivedClass(string somethingNew, int? someVal = null)
: base(someVal) // Pass someVal into BaseClass
{
// Do something with SomethingNew
}
}
然后可以将其称为:
var d = new DerivedClass("SomeValue");
var d2 = new DerivedClass("SomeOtherValue", 2);
答案 2 :(得分:1)
我会像这样设计基类
class BaseClass
{
public BaseClass() { ... }
public BaseClass(int someVal) : this() { }
}
确保始终执行...
代码。