c# - 如何在某些情况下使用不同的基类构造函数?

标签 c# inheritance

假设我们有两个类:

public class A
{
    protected static readonly int DefaultValue = 123;

    int value;

    public A()
    {
        value = DefaultValue;
    }

    public A(int _value)
    {
        value = _value;
    }
}

public class B : A
{
    public B(XElement x)
        : base(x.Element("int") == null 
                  ? A.DefaultValue 
                  : (int)x.Element("int"))
    {
    }
}

我知道我可以为 B 类创建一个无参数构造函数::

public B():base()
{
}

并且有这样的东西:

B objB = (x.Element("int") == null)?new B():new B((int)x.Element("int"));

但我希望将此逻辑封装在 B 类中。

此外,我发现我可以执行某种静态工厂方法并将其封装(如果需要,甚至可以将这些 B 类构造函数设为 private):

public static B GetInstance(XElement x)
{
    return (x.Element("int") == null)?new B():new B((int)x.Element("int"));
}

但我希望能够拥有像下面的伪代码这样的东西:

public class A
{
    //don't need this anymore 
    //protected static readonly int DefaultValue = 123;

    int value;

    public A()
    {
        value = 123;
    }

    public A(int _value)
    {
        value = _value;
    }
}

public class B : A
{
    public B(XElement x)
        : x.Element("int") == null
              ? base()
              : base((int)x.Element("int"))
    {
    }
} 

或者有没有其他方法可以做同样的事情,甚至更好?

最佳答案

可以更改所使用的基本构造函数的唯一条件是调用的实际构造函数 - 找到解决问题的另一种方法:)

如前所述,工厂方法是一种方法。另外,我相信Ninject (可能还有其他 DI 框架)允许根据参数值动态选择不同的构造函数。遗憾的是,我没有足够的 DI 经验..

这种情况下的另一种可能性是采用 int? ,虽然它确实改变了接口(interface),但允许 null 轻松合并为默认值。

关于c# - 如何在某些情况下使用不同的基类构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666460/

相关文章:

c++ - 如何从父指针调用子方法?

c# - 处理大图像时垃圾收集器太慢

c# - 如何在 Prism4 MEF 中创建我的类的实例?

c# - 我可以在 Linux 中编译 .net Core 3 WPF 应用程序吗?

javascript - 为什么使用 'prototype' 进行 javascript 继承?

swift - 当我不知道类型时,如何使用类继承进行解码?

java - 继承和重载构造函数

c# - 以编程方式在 ASP.NET 中添加用户控件

c# - 将来自两个互斥数据集的值合并到一个单独的数据集中

inheritance - Maven 项目版本继承 - 我是否必须指定父版本?