C# 在某些情况下如何使用不同的基类构造函数?
比如说,我们有两个班:C# 在某些情况下如何使用不同的基类构造函数?,c#,inheritance,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 { pub
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()
{
}
并且有这样的smth:
B objB = (x.Element("int") == null)?new B():new B((int)x.Element("int"));
但是我想把这个逻辑封装在B类中
我还发现我可以使用某种静态工厂方法并将其封装(如果需要,甚至可以将那些B类构造函数设置为私有的):
但我希望能够使用smth,如以下伪代码:
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"))
{
}
}
或者有没有其他方法可以做到与nice相同甚至更好?唯一可以更改所使用的基本构造函数的条件是调用的实际构造函数-找到解决问题的另一种方法:)
如前所述,工厂方法是一种方法。此外,我相信(可能还有其他DI框架)允许根据参数值动态选择不同的构造函数。遗憾的是,我没有足够的DI经验
在这种情况下,另一种可能性是采用int?
,虽然它确实改变了接口,但允许null
轻松合并到默认值。可以改变所使用的基本构造函数的唯一条件是调用的实际构造函数-找到解决问题的另一种方法:)
如前所述,工厂方法是一种方法。此外,我相信(可能还有其他DI框架)允许根据参数值动态选择不同的构造函数。遗憾的是,我没有足够的DI经验
在这种情况下,另一种可能是采用
int?
,虽然它确实改变了接口,但允许null
轻松合并到默认值。您是否尝试过在类a构造函数中使用null int(int?)呢?通过一个可选参数,您可能可以使用一个构造函数。您是否尝试过在类a构造函数中使用null int(int?)呢?通过一个可选参数,您可能只需要一个构造函数。您是否尝试过在类a构造函数中使用null int(int?)呢?使用可选参数,您可能只需要一个构造函数。@Spevy实际上在我的实际应用程序中,它不是int
,而是一种引用类型。并且null
不是基类字段的默认值。这就是为什么这不起作用。很抱歉,我的问题中的示例误导了您。@Spevy最后发现了一种完全不同的方法,在基类构造函数中使用了可选的bool参数。在我看来,我最初的方法比我现在的方法更为愚蠢。你的评论让我这么想,你能把它作为一个答案吗?你有没有试过在类a构造函数中使用null int(int?)呢?使用可选参数,您可能只需要一个构造函数。@Spevy实际上在我的实际应用程序中,它不是int
,而是一种引用类型。并且null
不是基类字段的默认值。这就是为什么这不起作用。很抱歉,我的问题中的示例误导了您。@Spevy最后发现了一种完全不同的方法,在基类构造函数中使用了可选的bool参数。在我看来,我最初的方法比我现在的方法更为愚蠢。就你的评论让我这么想,你能把它作为一个答案吗?+1作为唯一可以改变基本构造函数并找到解决问题的另一种方法的条件。我确实找到了另一种方法。+1表示唯一可以改变基本构造函数并找到解决问题的另一种方法的条件。我确实找到了另一种方法。
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"))
{
}
}