【问题标题】:What is the difference between a child of a parent class and the derived of a base class in VB.NET or C#?在 VB.NET 或 C# 中,父类的子类与基类的派生有什么区别?
【发布时间】:2012-10-13 18:34:00
【问题描述】:

在 Stack Overflow 上提问 Call a method that requires a derived class instance typed as base class in VB.NET or C# 后,我被告知我在提问时使用了错误的术语。我使用了“parent”和“child”,而应该使用“base”和“derived”。

我一直找不到对差异的准确描述。

这是我目前所知道的(或认为我知道的):

父类包含子类。派生类继承自基类。

它们是相似的,因为子(或派生)可以访问父(或基)属性和方法(在允许的情况下)。

它们是不同的,因为您可以以Parent.Child.Property 的形式引用子类的属性。而你不能用派生类做到这一点。

有什么区别以及在什么情况下应该使用一个而不是另一个?

【问题讨论】:

  • 您不应将答案编辑到问题中。只需投票/接受对您最有帮助的答案。如果他们都没有真正回答您的问题,那么请您自己回答。
  • @Servy 抱歉,已删除更新。我已经对有用的答案进行了投票,我将标记答案。

标签: c# vb.net parent-child derived-class


【解决方案1】:

当一个类派生自基类时,它被称为继承You inherit when you want to add functionality to an existing component, or extend the component.

当一个类被父类引用/包含在父类中时,它被称为封装You encapsulate when your (usually parent) object 'uses' components.

来自Ext - Inheritance vs. Encapsulation

什么时候继承,什么时候封装?当你继承 想要向现有组件添加功能。你封装 当您的对象“使用”组件时。如果你的新类“是 一个“Ext 组件。如果你的新类“有一个”Ext,你封装 组件。

Here is a link 详细介绍了面向对象编程中的继承和封装,并讨论了哪种概念在哪种情况下更好。

【讨论】:

  • 这不一定是真的,可以使用“父”作为“基”的同义词(子/派生同上)。但就像我在回答中所说的,父母/孩子不是技术术语,所以人们可以在不同的意义上使用它们。
  • @PaulSasik:你无法真正消除问题,因为问题的本质是这些术语的用法不明确。您指出的是术语“父母”和“孩子”的其他可能用途之一。答案不是 OP 的术语选择错误,而是他的术语选择不明确,他应该使用un不明确的术语。
  • @AdamRobinson:同意。父/子/基是模棱两可的。我认为,关键是要指定您是在继承还是封装的上下文中谈论。然后条款变得更加具体。
  • @PaulSasik:是的,但条款不限于这两个想法。例如,OP 推断出与嵌套类相关的父/子,它当然可以。
  • 引用:一个子类不能访问它的父类,除非它引用了它的父类,即使那样,它也只能访问父类的公共成员。我的想法。在 C# 中,嵌套在另一个类 Outer 中的类 Inner 可以访问 Outer 的私有成员。
【解决方案2】:

避免使用术语父/子我只想提一下,嵌套类可以将其自己的包含(“外部”)类作为其基类。我不认为这是人们经常使用的模式,但在语言 (C#) 中是允许的。

一个例子:

class MyClass
{
  // we choose to make the instance constructor private
  MyClass()
  {
  }

  // nested type, private to MyClass, deriving from MyClass
  class InnerMyClass : MyClass
  {
    // ...
  }

  public static MyClass GetMyClassInstance()
  {
    return new InnerMyClass();
  }

  // ...
}

【讨论】:

    【解决方案3】:

    parentchild 是比较抽象的关系。它们用于描述层次结构,因此可用于各种树(或有时 DAG)。
    类继承树就是这样一棵树,所以称它们为 parentchild 并没有错。
    该术语通常与其他类型的树一起使用,例如嵌套的 GUI 控件、目录结构......

    basederived 仅用于继承,因此更精确。首选此术语,因为它不太含糊。

    【讨论】:

    • 虽然,Paul Sasik 和 D Stanley 的回答可能更有帮助(在一般意义上)。你已经回答了被问到的问题(即使我没有完全理解我在问什么时间。)
    【解决方案4】:

    根据您使用父/子的方式,我认为您的意思是嵌套类。

    class Container
    {
        class Nested
        {
        }
    }
    

    默认情况下,嵌套类是私有的。这里的目的通常是Nested 将成为Container 使用的辅助类。例如,Nested 可以被 Container 中需要返回多个值的方法使用。 NestedContainer 的实例需要引用另一个才能访问其任何非静态成员。

    派生类继承自基类

    class Base
    {
    }
    
    class Derived : Base
    {
    }
    

    派生类具有其基类的所有功能,并且可以在任何可以使用基类的地方使用。 Derived 的实例可以访问所有公共和受保护的非静态成员。 Base 无权访问 Derived 的任何成员。此外,Derived 可以覆盖 Base 的虚拟成员的行为。

    【讨论】:

      【解决方案5】:

      在这两种情况下都使用父/子。它可用于描述您提到的“包含”关系(Parent.Child.Property),也可以表示派生类(也称为subclass)。

      底线是 - 要了解父/子的含义,您必须了解上下文。

      无论如何,这两个概念(继承与封装)之间的区别可以被认为是“is-a”和“has-a”的关系。

      • 是一种动物(继承)
      • 汽车有一个引擎(封装)

      【讨论】:

      • 谢谢你,我特别喜欢你的最后一句话。这是思考差异的好方法……我发现我一直在错误地使用它们……:S
      • @Gravitate - 好吧,我不会说你一直在“错误地”使用它们。正如我和其他人所说,这些术语用于表示两件事,所以当你说父母/孩子时,你只需要弄清楚你的意思
      • 不,我的意思是我在我的代码中使用错误。我在应该使用继承的地方使用了封装。
      【解决方案6】:

      Derived 在 OOP 中明确定义了类型之间的多态关系:

      public class A{
      }
      
      public class AB : A{
      }
      

      AB 类是 A 的派生类。

      ParentChild抽象关系的定义,在编程中可以得到不同的形状,如:

      public class A{
      }
      
      public class ParentA{
          List<A> children = ...
      }
      

      通常用在Graphlike关系中

      【讨论】:

        【解决方案7】:

        “Parent”是“base”的同义词,“child”是“derived”的同义词,但“parent”和“child”并不常见,而且技术含量不高(而且在 IMO 中听起来不太好)。另外两个术语是“超类”和“子类”。

        【讨论】:

        • 没有。对不起,但它们肯定是不同的。至少在 .net 中是这样的。
        • @Gravitate:.NET 没有自己的面向对象命名法。
        • @Gravitate 在 .NET 中的什么地方使用了“父/子”这个词?我听说过父/子表单,但没有听说过父/子类。
        • 对不起,我是否使用父/子作为特定术语,而实际上它们可用于描述任何关系,即。继承还是封装?我假设 Parent/Child 用于描述封装,而 Base 和 Derived 用于描述继承?这不正确吗?
        • @Gravitate:这是不正确的;请参阅 Tigra 或 CodeInChaos 的答案。父/子是模棱两可的,仅仅意味着两个事物之间存在某种层次关系,无论这种关系的性质是什么(继承、封装、嵌套类等)。
        【解决方案8】:

        parent 和 child 与封装的 OO 原则有关,而 base 和derived 与继承原则有关。

        被父类封装的子类,只暴露子类的公共方法,不能直接访问父类。

        派生类可以访问作为protected 或更高访问修饰符公开的基类的所有属性、方法和成员。

        【讨论】:

        • 给给-1的人,愿意评论吗?
        • -1 因为你的答案不正确。有关正确答案,请参阅 Tigran 和 CodeInChaos 的答案。父/子并不专门指代封装,而是指继承。
        • 这是一个解释问题。
        • 从某种意义上说,我认为任何问题的正确性都是一个解释问题,但是您的“父母和孩子必须与封装的OO原则有关”的陈述,您的整个答案是有根据的,是不正确的。是的,这些术语可以指代那个想法,但它们也可以指代其他想法。
        猜你喜欢
        • 2018-12-08
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        相关资源
        最近更新 更多