C#继承访问混乱

时间:2015-07-13 08:28:58

标签: c#-4.0

    public class ABC
    {
    }

    public class DEF : ABC
    {
    }

    public class Class1
    {
        ABC abc = new DEF(); //No error
        DEF def = new ABC(); //Compile time error
    }

任何人都可以向我解释这种情况。 在什么情况下我们可能会使用它。

3 个答案:

答案 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)

假设ABCPerson,而DEFStudentPerson的子类)。您始终可以将Student视为Person,因此对abc的{​​{1}}(类型Person)的分配是正确的,但您无法对待通用StudentPerson,因此Student的分配错误(例如,您无法获取非学生的学生编号)

答案 2 :(得分:1)

这被称为Ploymorphism。 正如MSDN中所解释的

  

在运行时,派生类的对象可以被视为a的对象   基类,如方法参数和集合或   阵列。发生这种情况时,不再声明对象的声明类型   与其运行时类型相同。

     

基类可以定义和实现虚拟方法,并派生   类可以覆盖它们,这意味着它们提供自己的   定义和实施。在运行时,当客户端代码调用时   方法,CLR查找对象的运行时类型,并调用   覆盖虚方法。因此,在您的源代码中,您可以   在基类上调用一个方法,并导致派生类的版本   要执行的方法。

这个问题的答案最好在MSDN Polymorphism

解释