Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我对这个简单的OOP练习(C#/Java)有困难_Java_C#_Oop_Inheritance_Polymorphism - Fatal编程技术网

我对这个简单的OOP练习(C#/Java)有困难

我对这个简单的OOP练习(C#/Java)有困难,java,c#,oop,inheritance,polymorphism,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(); } 我需要根据给定的代码确定类之间的关系,并从下面的列表中选择正确的答案: C从A继承,B从A继承,D从A继承 A从C继承,B从A继承,D从A继承 C从A继承,B从A继承,D从B继承 A从C继承,C从B继承,D从A继承 A从C继承,B

鉴于这段代码:

public static void main(String[] args)
{
    C c = new A();
    B bl = (B)(new A());
    B b2 = new D();
    A a = new D();
}
我需要根据给定的代码确定类之间的关系,并从下面的列表中选择正确的答案:

  • C从A继承,B从A继承,D从A继承

  • A从C继承,B从A继承,D从A继承

  • C从A继承,B从A继承,D从B继承

  • A从C继承,C从B继承,D从A继承

  • A从C继承,B从A继承,D从B继承, C继承自B

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

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

    从第三行我确定D继承自B,从第四行我确定D也继承自A

    根据一些有答案的网站,正确答案是选项4。我理解这一点,因为这是唯一一个部分包含我得出的结论的选项,而其他选项包含明显的错误或不支持的声明。我不明白的是,为什么C继承了B?(根据选项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)
    }
    

    这是唯一一个选项,在所有代码行中都可以使用,没有例外

    仅仅因为不需要施法并不意味着你可以明确地说出来。你是对的-从技术上讲,你不需要(B)在:

    无论如何,获取此依赖关系树并不一定简单。以下是您真正了解的:

  • A是C的孩子/孙子/等
  • A是B的孩子/孙子/等
  • D是B的孩子/孙子/等
  • D是A的子女/孙子/等
  • 认识到这一点非常重要,因为您知道A从C继承并不意味着A是C的直接子级。在继承图中,它们之间可能有其他类

    假设没有任何其他类(据你所知,在这两个类中的任何一个之间都有一个类“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,因此它位于长链的底部

        public class A : C { }
        public class B { }
        public class C : B { }
        public class D : A { } 
    
    所以,当一切都说了又做了:

    • A:继承自B和C
    • B:可能是从C继承的
    • C:可能是从B继承的
    • D:继承自A、B和C

    事实上,没有任何东西可以得出这样的结论
    C
    也可以是
    B
    的基类
    B
    可以是一个接口。根据教科书中提供的详细信息,B是一个类。试着编写实际的类来测试它,看看它与您的期望有什么不同。这似乎只需要使用您已有的知识就代码进行争论,而这也可以通过编写一些代码轻松解决,这并不是最有用的问题。这似乎不像你能推断什么,而是a。以下哪项是正确的,因为它没有告诉你C和B之间的直接关系。你能详细说明你是如何在第二行得出结论的吗?@blablabla:
    B
    a
    @Tigran的基类这并不一定意味着B是C的基类。正确答案之所以正确,只是因为它是唯一适合的。@juharr:我从来没有说过,对于那行代码,这是唯一可能的解释。问题是,为什么第四个答案对于所提供的代码是正确的,所以我的答案旨在解释为什么它满足所提供示例中的所有代码条件。
        public class A : C { }
        public class B { }
        public class C : B { }
        public class D : A { }