我偶然发现了一个我想不出好的解决方法的问题。
我的程序中有一些对象需要在发生某些事件时重新初始化。我需要重新初始化的对象是抽象类的子类。
虽然这似乎是一种糟糕的方法,但我决定在抽象类中有一个抽象的重新初始化函数,并让所有子类实现该函数。但是现在存在每个子类在其构造函数中采用不同参数的问题。
我的最小示例如下所示:
abstract class Base
{
public abstract void Init(/* Some parameter */);
}
class SubA : Base
{
public SubA(int a)
{
Init();
}
public override void Init(int a)
{
//do stuff with int
}
}
class SubB : Base
{
public SubB(string b)
{
Init();
}
public override void Init(string b)
{
//do stuff with string
}
}
class Program
{
static void Main(string[] args)
{
List<Base> stuff = new List<Base>()
{
new SubA(65),
new SubB("B")
};
foreach (var s in stuff)
{
s.Init();
}
}
}`
我确实相信这个解决方案有代码味道,所以欢迎任何避免这种情况的建议。如果需要任何其他信息来帮助我,请告诉我。
最佳答案
好吧,解决方案很简单,只需在私有(private)字段中声明特定 变量并在paramaterless Init
方法中使用这些字段,如下所示:
class SubA : Base
{
private int _a;
public SubA(int a)
{
_a = a;
Init();
}
public override void Init()
{
//do stuff with int _a
}
}
class SubB : Base
{
private string _b;
public SubB(string b)
{
_b = b;
Init();
}
public override void Init()
{
//do stuff with string _b
}
}
此外,您还可以创建抽象类接口(interface),这样实现它的类也可以从其他基类继承。
关于c# - 创建一个抽象函数,它根据继承者接受不同的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58843775/