我有一个小问题。
当我开始编程我的应用程序时,我将同一级别的类型分组到类FirstLevel
(该级别的所有类型都派生自FirstLevel
)。之后,我开始使用这种类型创建通用列表,我的代码正在使用它而没有任何错误。
现在,经过一段时间后,我需要在每个类中使用函数Generate
,该函数派生自FirstLevel
或者父元素是从FirstLevel派生的。我认为该接口可以是一个很好的解决方案,所以我开始为每个类实现接口IGenerable
,这个类与FirstLeve
l类有共同之处(它是派生的,或者它的父元素是派生的,或者是它的父元素....)我已经将它实现到FirstLevel类。
这是我的问题的开始。我需要在List<FirstLevel>
中的每个项目上调用generate函数。但我不知道是否会在IGenerable
中调用FirstLevel
的实现,或在派生类中调用IGenerable
的实现。我希望计算机将在派生类中执行调用实现。请告诉我它是怎么回事。
但是,如果将FirstLevel
称为实施,请帮助我并提出一些解决方案。感谢。
答案 0 :(得分:2)
不是使用Interface,而是通过向基类(FirstLevel)添加虚函数Generate,然后根据需要覆盖后代中的方法,可能会更好。现在当你遍历List并调用Generate时,如果对象有一个重写方法,它将执行那个,否则它将从基础对象执行该方法。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var objs = new List<FirstLevel> { new FirstLevel(), new SecondLevel(), new ThirdLevel(), new SecondLevel2() };
objs.ForEach(o => o.Generate());
Console.ReadLine();
}
}
public class FirstLevel
{
public virtual void Generate()
{
Console.WriteLine("First Level Generate called.");
}
}
public class SecondLevel : FirstLevel
{
public override void Generate()
{
Console.WriteLine("Second Level generate called.");
}
}
public class SecondLevel2 : FirstLevel
{
}
public class ThirdLevel : SecondLevel
{
public override void Generate()
{
Console.WriteLine("Third Level genrate.");
}
}
}