Basiclly我有一个类Individual
和另一个继承它的类 - IndividualForSomeAnotherWork
。
我也有一个名为Population
的课程和Add(Individual individual)
等方法。
我可以通过IndividualForSomeAnotherWork
类型将Individual
传递给Add方法吗?或者我应该使用接口或抽象类?我问,因为我一直都在NullReferenceException
。
编辑: 很抱歉没有回答这么久。我的问题是没有初始化包含对象的List,所以我无法添加它。但我也想知道我可以像前面所说的那样传递论据。谢谢你的回答。
答案 0 :(得分:1)
我建议使用IIndividual
类型的界面。在这种情况下,如果你有:
abstract class Individual : IIndividual {
}
class IndividualForSomeOtherWork : Individual {
}
...然后Population.Add(IIndividual Individual)
将接受基类Individual
以及Individual
的任何后代。
将接口视为与Population类的契约,其中的任何个体都将实现其所需的所有功能。
请注意,实现接口中定义的所有函数不需要抽象Individual
。如果界面需要:
interface IIndividual {
void DoWork();
}
...然后基地Individual
不了解IndividualForSomeOtherWork
实际执行的专业工作。所以在抽象类中:
abstract void DoWork();
此功能必须在专门的个人后代中定义。
答案 1 :(得分:0)
是的,您可以将IndividualForSomeAnotherWork
传递给Add(Individual individual)
。它应该正常工作。您的错误是由于其他原因造成的。尝试自己调试,或发布更多详细信息和代码,我们可能会提供帮助。
答案 2 :(得分:0)
就你在这里要做的事而言,抽象类与界面并没有根本的不同。在这两种情况下,都不可能有一个类型与形式参数的类型完全匹配的参数。有关此明确的示例,请参阅DrawImage。(Image是一个抽象类)。
您看到的NullReferenceException与抽象的参数类型没有直接关系。