【问题标题】:System.Object being the base classSystem.Object 是基类
【发布时间】:2012-01-06 07:33:16
【问题描述】:

这个问题对很多人来说可能很常见,我尝试了一个小时来理解这些事情,但没有得到正确的解释。

MSDN 说,System.Object 是.NET Framework 中所有类的终极基类;它是类型层次结构的根。

当 C# 不允许多重继承时,我该如何继承,比如从 A 类到 B 类。?因为所有的类,已经继承自 System.Object 对吧? 这里我说的是正常的继承。

Class A { --- }
Class B : A { --- }

请消除我的疑虑。 谢谢。

更新:

再次,我的疑问是,所有类都继承自 System.Object,那么这将使 B 类具有 A 类和 System.Object。从我上面的例子中

【问题讨论】:

    标签: c# inheritance


    【解决方案1】:

    您似乎对“多重继承”的含义有些混淆?

    当“B 继承自 A,A 继承自 O”时,多重继承不是。这只是一个简单的继承层次结构——这是 C++、Java 和 C# 的一个特性。

    在上面的例子中,我们说B从A继承直接,从O继承间接。B从A继承(非私有)成员,以及间接地,O 的(非私有)成员。

    C++ 还支持真正的多重继承,有时可以称为“混合继承”:多重继承的一个例子是

     class A : public O {};
     class B : A, O {};
    

    这里 B 直接继承自 O,直接继承自 A -- 在这种情况下 两个副本 O 的成员存在于 B 中,并且要访问的成员来自 O 的 B,您需要指定您想要哪些副本:

    例如b.O::omember;b.A::omember;

    对于大型 C++ 类框架,当您使用多重继承时,您通常会在派生类中获得不需要的基类副本。为了解决这个问题,C++ 提供了虚拟继承,它强制只继承虚拟基类的一个副本:下面的示例应该清楚地说明这一点(或者让它更加混乱!)

    // Note, a struct in C++ is simply a class with everything public
    struct O { int omember; };
    struct A1 :  O {};
    struct B1 :  O, A1 {};
    
    struct A2 :  virtual O {};
    struct B2 :  virtual O, A2 {};
    
    B1 b1;
    B2 b2;
    
    // There are two 'omember's in b1
    b1.omember; // Compiler error - ambiguous
    b1.A1::omember = 1;
    b1.O::omember = 2;
    
    // There's only one 'omember' in b2, so all the following three lines
    // all set the same member
    b2.A2::omember = 1;
    b2.O::omember = 2;
    b2.omember = 3;
    

    【讨论】:

      【解决方案2】:

      看,你只能有一个父亲。但你父亲也可以有父亲。因此,您从祖父那里继承了一些属性。 Dog 类继承自 Mammals,后者又继承自 Animal 类,后者又继承自 LivingThing 类。

      【讨论】:

      • ... 它又继承自 System.Object 类 :)
      【解决方案3】:

      很容易。 猿继承自动物,黑猩猩继承自猿。黑猩猩也继承自动物,但并非主要是通过猿。 在 .NET 中,如果类没有显式声明其继承,编译器会添加 IL 代码以从 System.Object 继承它。如果是,则通过父类型继承 System.Object。

      【讨论】:

        【解决方案4】:

        多重继承是指从多个类继承到一个类中。您的示例有效,但您无法执行以下操作:

        B 类:A,C { --- }

        多重继承的定义:

        “多重继承是一些面向对象的计算机编程语言的特性,其中一个类可以从多个超类继承行为和特性。”

        【讨论】:

        • 我明白 C# 中不能有多重继承,但同样,如果所有类都继承自 System.Object,那么 B 类如何同时拥有 A 类和 System.Object(相对于我的例子)?
        【解决方案5】:

        你不能继承两个类,但是你可以继承一个层次的类。

        System.Object
            |
             \-- Class A {}
                 |
                  \-- Class B {}
        
        
        
        public class ClassA
        {
        }
        
        public class ClassB : ClassA
        {
        }
        
        public class ClassC : ClassB
        {
        }
        

        【讨论】:

          【解决方案6】:

          多重继承意味着例如A 类直接继承自 B 类和 C 类,如下所示:

          class A : B, C
          

          在 C# 中不起作用。您的示例意味着您从一个本身继承自另一个的类继承,如下所示:

          class A : object
          {
          }
          
          class B : A
          {
          }
          

          这在 C# 中是可能的。

          【讨论】:

            【解决方案7】:

            A 类继承自 System.Object。类B继承自类A,后者继承自System.Object

            【讨论】:

              【解决方案8】:

              正确,C# 只允许单一继承。 System.Object 类由您的 A 类隐式继承。所以 B 类是-a A,它是-a System.Object。这由编译器处理,因此您无需明确表示 Class A : System.Object(尽管您可以根据需要)。

              【讨论】:

              • 好的,我通过 A is-a System.Object 理解了这一点。但是,如果所有类都默认继承到 System.Object,那不就使得 Class B 有两个继承,即 Class A 和 System.Object?
              • 不,B 类仅从 A 类继承。它继承了System.Object,因为它继承自A,而A继承了System.Object。 System.Object 继承由编译器添加到所有继承层次结构的 top... 仅顶部。
              • 好的,所以我得到的最终结论是,每个类都继承自 System.Object,但在应用程序级别继承的情况下,只有最顶层的类将 System.Object 作为基类?
              • 是的 - 就是这样。 System.Object 父级被添加到继承层次结构中的所有基类(即使层次结构中只有一个类)。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-08
              • 1970-01-01
              • 1970-01-01
              • 2020-12-03
              相关资源
              最近更新 更多