这个简单的OOP练习(C#/ Java)

时间:2018-03-27 19:15:17

标签: java c# oop inheritance polymorphism

鉴于这段代码:

public static void main(String[] args)
{
    C c = new A();
    B bl = (B)(new A());
    B b2 = new D();
    A a = new D();
}

我被要求根据给定的代码确定类之间的关系,并从下面的列表中选择正确的答案:

  1. C继承自A,B继承自A,D继承自A。

  2. A继承自C,B继承自A,D继承自A。

  3. C继承自A,B继承自A,D继承自B.

  4. A继承自C,C继承自B,D继承自A。

  5. A继承自C,B继承自A,D继承自B, C继承自B。

  6. 从第一行开始,我确定A继承自C(由于向上转换),这消除了选项1和3。

    第二行对我来说有些问题。我不知道我是否正确,但是我用它来断定A不会从B继承,因为否则铸造不是必要的。

    从第三行开始,我确定D继承自B,而第四行则继承自A。

    根据一些回答这个问题的网站,正确的答案是选项4.我理解,因为这是部分包含我得出的结论的唯一选择,而其余的包含明显的错误或不支持的声明。我不明白的是,为什么C继承自B? (根据选项4)。我无法从代码中的任何地方得出结论。

    为什么这是真的?将非常感谢帮助:)

2 个答案:

答案 0 :(得分:0)

根据第4个答案,依赖树看起来像(从最顶层开始):

B->C->A->D,分解为:

public static void main(String[] args)
{
    C c = new A();       // C->A       (direct parent)
    B bl = (B)(new A()); // B->C->A    (2 levels up), casting to B can be avoided
    B b2 = new D();      // B->C->A->D (3 levels up)
    A a = new D();       // A->D       (direct parent)
}

这是唯一一个适用于所有代码行的选项,无一例外。

答案 1 :(得分:0)

仅仅因为没有必要进行施法并不意味着你可以明确拼写出来。你是对的 - 从技术上讲你不需要(B):

B bl = (B)(new A());

无论如何,获取此依赖关系树并不一定简单。这就是你真正知道的:

  1. A是C
  2. 的孩子/孙子/等
  3. A是B
  4. 的孩子/孙子/等
  5. D是B
  6. 的孩子/孙子/等
  7. D是A
  8. 的孩子/孙子/等

    非常重要的是要认识到,仅仅因为你知道A继承自C 而不是意味着A是C的直接子节点。在继承图中它们之间可能存在其他类。< / p>

    假设没有任何其他类(对于所有你知道的,在这两个类之间有一个'E'类),实际上有两种方法来绘制它 - 没有足够的信息来判断它是什么

    选项A:C是基类

    C是基类 - 没有理由不能,因为它不是来自其他任何东西。 A必须来自B和C,所以B必须在A和C之间的树上。同样,D来自A,使其成为一条长链:

        public class A : B { }
        public class B : C { }
        public class C { }
        public class D : A { } 
    

    选项B:B是基类。

    B是基类。毕竟,它不是来自任何东西,所以没有理由不能。与第一个选项类似,A必须从B和C得到,这意味着C直接在A和B之间的链上。同样,D来自A,因此它位于长链的底部。 / p>

        public class A : C { }
        public class B { }
        public class C : B { }
        public class D : A { } 
    

    所以,当这一切都说完了:

    • 答:继承B和C
    • B:可能继承自C
    • C:可能继承自B
    • D:继承自A,B和C