public class ABC
{
}
public class DEF : ABC
{
}
public class Class1
{
ABC abc = new DEF(); //No error
DEF def = new ABC(); //Compile time error
}
任何人都可以向我解释这种情况。 在什么情况下我们可能会使用它。
答案 0 :(得分:2)
这是因为根据OOD规则,您可以将子项分配给父级,但不能将父级分配给子级。
//this possible as you re assigning child to parent
ABC abc = new DEF(); //No error
//this is illegal as you are trying to assign child to parent directly
DEF def = new ABC(); //Compile time error
再次重新考虑您的设计,或者如果您想将父对象转换为子对象而不是您需要直接转换的方法,则无法按照OOD规则执行此操作。
考虑客户和RetailCustomer或银行的Corporatecustomer的实时示例关系。您可以轻松地说RetailCustomer或CorporateCustomer是客户,但您不能说客户是RetailCustomer或CorporateCustomer,因为客户可以是任何类型。
父形状类和子矩形,圆形等类之间的关系也是如此。
答案 1 :(得分:1)
假设ABC
为Person
,而DEF
为Student
(Person
的子类)。您始终可以将Student
视为Person
,因此对abc
的{{1}}(类型Person
)的分配是正确的,但您无法对待通用Student
为Person
,因此Student
的分配错误(例如,您无法获取非学生的学生编号)
答案 2 :(得分:1)
这被称为Ploymorphism。 正如MSDN中所解释的
在运行时,派生类的对象可以被视为a的对象 基类,如方法参数和集合或 阵列。发生这种情况时,不再声明对象的声明类型 与其运行时类型相同。
基类可以定义和实现虚拟方法,并派生 类可以覆盖它们,这意味着它们提供自己的 定义和实施。在运行时,当客户端代码调用时 方法,CLR查找对象的运行时类型,并调用 覆盖虚方法。因此,在您的源代码中,您可以 在基类上调用一个方法,并导致派生类的版本 要执行的方法。
这个问题的答案最好在MSDN Polymorphism
解释