我如何允许 child class 调用具有相同签名的多个基本构造函数之一?
How can I allow a child class to call one of multiple base constructors with the same signatures?
我在 C# 中有一个 parent class,其中包含多个构造函数。其中一些具有相同的签名,例如。
public MyClass()
{
//Do something
}
public MyClass()
{
//Do something else
}
如何让 child class 仅选择这些构造函数中的一个作为基础?
在 C# 中,不可能在单个 class 中有多个具有相同签名的构造函数。为什么不简单地实现多个受保护的方法——每个方法都有自己的特定名称,然后从子构造函数中调用所需的方法?像这样:
public class MyClass
{
protected Foo()
{
// Do something
}
protected Bar()
{
// Do something else
}
}
public class MyChildClass : MyClass
{
public MyChildClass(int x)
{
if(x > 0)
{
Foo();
}
else
{
Bar();
}
}
}
更新
根据评论中提供的附加信息,我添加了一个可能更适合您的情况的解决方案:
public class MyGrandClass
{
public MyGrandClass(string name)
{
// Do something with the name.
}
public MyGrandClass()
{
// Do something else.
}
}
public class MyClass : MyGrandClass
{
public MyClass(string name) : base(name)
{
}
public MyClass()
{
}
}
public class MyChildClass : MyClass
{
public MyChildClass(string name) : base(name)
{
}
public MyChildClass()
{
}
}
虽然您不可能定义多个具有相同参数(或根本没有参数...)的构造函数,您可以定义一个具有可选参数的构造函数 :
public class A
{
public A(string x = null, int y = -1)
{
}
}
public class B : A
{
public B(string x) : base(x)
{
}
}
public class B2 : A
{
public B(int y) : base(y)
{
}
}
// You can even inherit A and don't call the A's constructor
// because all parameters are optional
public class B3 : A
{
}
我在 C# 中有一个 parent class,其中包含多个构造函数。其中一些具有相同的签名,例如。
public MyClass()
{
//Do something
}
public MyClass()
{
//Do something else
}
如何让 child class 仅选择这些构造函数中的一个作为基础?
在 C# 中,不可能在单个 class 中有多个具有相同签名的构造函数。为什么不简单地实现多个受保护的方法——每个方法都有自己的特定名称,然后从子构造函数中调用所需的方法?像这样:
public class MyClass
{
protected Foo()
{
// Do something
}
protected Bar()
{
// Do something else
}
}
public class MyChildClass : MyClass
{
public MyChildClass(int x)
{
if(x > 0)
{
Foo();
}
else
{
Bar();
}
}
}
更新
根据评论中提供的附加信息,我添加了一个可能更适合您的情况的解决方案:
public class MyGrandClass
{
public MyGrandClass(string name)
{
// Do something with the name.
}
public MyGrandClass()
{
// Do something else.
}
}
public class MyClass : MyGrandClass
{
public MyClass(string name) : base(name)
{
}
public MyClass()
{
}
}
public class MyChildClass : MyClass
{
public MyChildClass(string name) : base(name)
{
}
public MyChildClass()
{
}
}
虽然您不可能定义多个具有相同参数(或根本没有参数...)的构造函数,您可以定义一个具有可选参数的构造函数 :
public class A
{
public A(string x = null, int y = -1)
{
}
}
public class B : A
{
public B(string x) : base(x)
{
}
}
public class B2 : A
{
public B(int y) : base(y)
{
}
}
// You can even inherit A and don't call the A's constructor
// because all parameters are optional
public class B3 : A
{
}