繁体   English   中英

如何在C#中处理基类构造函数?

[英]How to handle base class constructors in C#?

我有一个扩展基类的类。 基类更通用,因此需要更多参数。 派生类是特定类型的基类,因此只需要基类在其构造函数中需要的两个参数中的一个(派生类可以为基类提供第二个参数,但需要先进行一些处理)。

是否有可能在派生类中有一个构造函数,然后调用基类构造函数?

我知道我可以使用: base(int a, int b)如果参数是直接传入的,但我认为我不能这样做,因为我需要在调用基类构造函数之前处理第二个变量。

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
        }
    }
}

一种方法是使用三元运算符

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);
  }
}

你可以直接进行,不是吗?

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;
}

如果您可以编写静态函数来处理数据,则可以或多或少地执行此操作:

class Bar : Foo 
{
    public Bar(int a, bool plusOrMinus) : base(a, calc(plusOrMinus))
    {
    }

    private static calc(bool pom) : ...; return -5; }
}

我的建议是使用构图而不是继承。

而不是从你的基类(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);
        }
    }
}

这种方法怎么样?

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;
    }
}

我更喜欢在基类上创建一个受保护的Initialize(...),并在继承类的ctr末尾调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM