public class ABC
{
}
public class DEF : ABC
{
}
public class Class1
{
ABC abc = new DEF(); //No error
DEF def = new ABC(); //Compile time error
}
任何人都可以向我解释这种情况。 以及在什么情况下我们可以使用它。C#继承访问混淆
public class ABC
{
}
public class DEF : ABC
{
}
public class Class1
{
ABC abc = new DEF(); //No error
DEF def = new ABC(); //Compile time error
}
任何人都可以向我解释这种情况。 以及在什么情况下我们可以使用它。C#继承访问混淆
这称为多形现象。 如MSDN
说明在运行时,派生类的对象可以被视为在地方 基类的对象,如方法参数和集合或 阵列。发生这种情况时,该对象的声明类型不再是与其运行时类型相同的 。
基类可以定义和实现虚拟方法,并且派生类可以覆盖它们,这意味着它们提供了它们自己的定义和实现。在运行时,当客户端代码调用 方法时,CLR将查找对象的运行时类型,并调用 来覆盖虚拟方法。因此,在源代码中,您可以调用基类上的方法,并使该方法的派生类版本 执行。
的这个问题是最好的解释这里MSDN Polymorphism
因为根据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是客户,但不能说Customer是RetailCustomer或CorporateCustomer,因为客户可以是任何类型。
Parent Shape Class和Child Rectangle,Circle等类之间的关系也是一样的。
感谢答案。我刚才在这里问过这个问题,因为面试的人问我这个问题,我感到困惑......像一群人一样困惑的孩子! –
@MayurMohite - 除了接受的答案,你也可以把一些真实世界的senario,因为我已经给出了更新的答案... –
比方说ABC
是Person
,而DEF
是Student
(这是Person
一个子类)。你总是可以治疗Student
作为Person
,所以分配给abc
(的Person
类型)的Student
是正确的,但你不能把一个普通Person
为Student
,所以分配给def
是错误的(例如,你不能得到不是学生的人的学号)
是啊...简单的逻辑,谢谢! –
该链接清除了所有内容。十分感谢 –