我偶然发现了一个我认为无法解决的好方法。
我的程序中有一些需要在发生某些事件时重新初始化的对象。我需要重新初始化的对象是抽象类的子类。
尽管这似乎是一种不好的方法,但我还是决定在抽象类中使用一个抽象的重新初始化函数,并让所有子类都实现该函数。但是现在存在一个问题,每个子类在其构造函数中采用不同的参数。
我有的最小示例如下:
abstract class Base
{
public abstract void Init();
}
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();
}
}
}`
我确实相信此解决方案具有代码味道,因此欢迎您提出任何避免这种情况的建议。请让我知道是否需要任何其他信息来帮助我。
我认为您可能需要使用一个接口。
public interface IBase
{
void Init(object obj);
}
public class SubA : IBase
{
public SubA(int a)
{
Init(a);
}
public void Init(object obj)
{
int a = (int)obj;
// do stuff
}
}
public class SubB : IBase
{
public SubB(string s)
{
Init(s);
}
public void Init(object obj)
{
string s = (string)obj;
// do stuff
}
}
class Program
{
static void Main(string[] args)
{
List<IBase> stuff = new List<IBase>()
{
new SubA(65),
new SubB("B")
};
}
}
嗯,解决方案很简单,只需在私有字段中声明specific变量,然后在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
}
}