我有一个扩展基类的类。基类更通用,因此需要更多参数。派生类是特定类型的基类,因此只需要基类在其构造函数中需要的两个参数中的一个(派生类可以为基类提供第二个参数,但需要先进行一些处理)。
是否有可能在派生类中有一个构造函数,然后调用基类构造函数?
我知道如果参数是直接传入的话我可以使用: base(int a, int b)
,但我认为我不能这样做,因为我需要在调用基类构造函数之前处理第二个变量。 / p>
class Foo {
private int c;
public Foo(int a, int b) {
c = a + b;
}
}
class Bar : Foo {
public Bar(int a, bool plusOrMinus) {
if (plusOrMinus) {
Foo(a, 5); // calling base class constructor- AFTER processing
} else {
Foo(a, -5); // calling base class constructor- AFTER processing
}
}
}
答案 0 :(得分:4)
执行此操作的一种方法是使用三元运算符
public Bar(int a, bool plusOrMinos) : base(a, plusOrMinus ? 5 : -5) {
...
}
对于更复杂的条件,但您应该切换到静态工厂方法
private Bar(int a, int b) : base(a, b) {
...
}
public static Bar Create(int a, bool plusOrMinus) {
if (plusOrMinus) {
return new Bar(a, 5);
} else {
return new Bar(a, -5);
}
}
答案 1 :(得分:2)
你可以在网上做,不是吗?
public Bar(int a, bool plusOrMinus) : base(a, plusOrMinus ? 5 : -5) {
}
如果您需要做更复杂的事情,可以将逻辑提取到静态方法中:
public Bar(int a, bool plusOrMinus) : base(a, GetValueFromPlusOrMinus(plusOrMinus)) {
}
public static int GetValueFromPlusOrMinus(bool plusOrMinus)
{
if (plusOrMinus)
return 5;
else
return -5;
}
答案 2 :(得分:2)
如果您可以编写静态函数来处理数据,您可以或多或少地执行此操作:
class Bar : Foo
{
public Bar(int a, bool plusOrMinus) : base(a, calc(plusOrMinus))
{
}
private static calc(bool pom) : ...; return -5; }
}
答案 3 :(得分:1)
我的建议是使用构图而不是继承。
而不是从你的基类(X)派生出一堆子类(A,B,C),而是让A,B,C包含他们可以调用的X的私有实例。
这样,您只能在一个地方(X)拥有共享逻辑,并且所有类都可以使用它。
class Foo {
private int c;
public Foo(int a, int b) {
c = a + b;
}
}
class Bar {
private Foo _base;
public Bar(int a, bool plusOrMinus) {
if (plusOrMinus) {
_base = new Foo(a, 5);
} else {
_base = new Foo(a, -5);
}
}
}
答案 4 :(得分:1)
这种做法怎么样?
class Foo
{
private int c;
public Foo(Builder builder)
{
c = builder.A ?? 0 + builder.B ?? 0;
}
}
class Bar : Foo
{
public Bar()
: base(new Builder().WithA(2).WithB(3).WithPlusOrMinus(false))
{
}
}
public class Builder
{
public int? A { get; private set; }
public int? B { get; private set; }
public bool? PlusOrMinus { get; private set; }
public Builder WithA(int a)
{
A = a;
return this;
}
public Builder WithB(int b)
{
B = b;
return this;
}
public Builder WithPlusOrMinus(bool plusOrMinus)
{
if(!plusOrMinus)
{
B *= -1;
}
return this;
}
}
答案 5 :(得分:1)
我更喜欢在基类上创建一个受保护的Initialize(...),并在继承类的ctr末尾调用它。