10

在提出问题调用需要在 VB.NET 或Stack Overflow 上的 C# 中键入为基类的派生类实例的方法后,我被告知在提出问题时我使用了错误的术语。我在应该使用“base”和“derived”的地方使用了“parent”和“child”。

我一直无法找到对差异的良好描述。

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

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

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

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

有什么区别,在什么情况下应该使用一种而不是另一种?

4

8 回答 8

8

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

basederived仅用于继承,因此更精确。这个术语是首选,因为它不那么模棱两可。

于 2012-10-23T18:53:42.487 回答
5

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

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

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

  • 动物(继承)
  • 汽车引擎(封装)
于 2012-10-23T18:48:28.310 回答
3

当一个类从基类派生时,它被称为继承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 - 继承与封装

什么时候继承,什么时候封装?当您想向现有组件添加功能时,您可以继承。当您的对象“使用”组件时,您封装。如果您的新类“是”Ext 组件,则您继承。如果您的新类“具有”Ext 组件,则进行封装。

这是一个链接,详细介绍了面向对象编程中的继承和封装,并讨论了哪种概念在哪种情况下更好。

于 2012-10-23T18:44:21.667 回答
2

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

public class A{
}

public class AB : A{
}

AB是派生自的类A

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

public class A{
}

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

通常用于Graph相似的关系

于 2012-10-23T18:47:10.867 回答
0

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

class Container
{
    class Nested
    {
    }
}

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

派生类从基类继承

class Base
{
}

class Derived : Base
{
}

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

于 2012-10-23T18:51:05.390 回答
0

避免使用术语父/子我只想提一下,嵌套类有可能拥有自己的包含(“外部”)类作为其基类。我不认为这是人们经常使用的模式,但在语言(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();
  }

  // ...
}
于 2012-10-23T19:19:27.870 回答
0

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

由父类封装的子类,只公开子类的公共方法,不能直接访问父类。

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

于 2012-10-23T18:45:00.487 回答
0

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

于 2012-10-23T18:46:17.653 回答