10

質問をした後、VB.NETまたはStack OverflowのC#で基本クラスとして入力された派生クラスインスタンスを必要とするメソッドを呼び出すと、質問をするときに間違った用語を使用したことが通知されました。代わりに「ベース」と「派生」を使用する必要がある「親」と「子」を使用していました。

私は違いの良い説明を見つけることができませんでした。

これは私がこれまでに知っている(または私が知っていると思う)ことです:

親クラスには子クラスが含まれます。一方、派生クラスは基本クラスから継承します。

子(または派生)が親(またはベース)のプロパティとメソッド(許可されている場合)にアクセスできるため、これらは似ています。

子クラスのプロパティをの形式で参照できるため、これらは異なりますParent.Child.Property。一方、派生クラスではそれを行うことはできません。

違いは何ですか?また、どのような状況で一方を他方よりも使用する必要がありますか?

4

8 に答える 8

8

はより抽象的な関係です。これらは階層を記述するために使用されるため、あらゆる種類のツリー(または場合によってはDAG)で使用できます。クラス継承のツリーはそのようなツリーの1つであるため、それらを親
と 呼ぶのは間違いではありません。 この用語は、ネストされたGUIコントロール、ディレクトリ構造など、他の種類のツリーでよく使用されます。

baseおよびderivedは継承にのみ使用されるため、より正確になります。あいまいさが少ないため、この用語が推奨されます。

于 2012-10-23T18:53:42.487 に答える
5

親/子は両方のコンテキストで使用されます。これは、前述のように「含む」関係を記述するために使用できます( )、または派生クラス(サブクラスParent.Child.Propertyとも呼ばれます)を意味する場合があります。

結論は-親/子が何を意味するのかを理解するには、コンテキストを知っている必要があります。

いずれにせよ、2つの概念(継承とカプセル化)の違いは、「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{
}

classABは。から派生したクラスですA

抽象的な関係の定義であり、プログラミングでは次のようなさまざまな形をとることができます。

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のメソッドで使用できます。のインスタンス、NestedまたはContainerその非静的メンバーのいずれかにアクセスするには、他のインスタンスへの参照が必要になります。

派生クラスは基本クラスから継承しますが

class Base
{
}

class Derived : Base
{
}

派生クラスは、その基本クラスのすべての機能を備えており、基本クラスを使用できる場所であればどこでも使用できます。のインスタンスはDerived、すべてのパブリックメンバーと保護された非静的メンバーにアクセスできます。 BaseのメンバーにはアクセスできませんDerived。さらに、Derivedの仮想メンバーの動作をオーバーライドできますBase

于 2012-10-23T18:51:05.390 に答える
0

親と子はカプセル化のオブジェクト指向の原則と関係がありますが、ベースと派生は継承の原則と関係があります。

親クラスによってカプセル化された子クラス。子のパブリックメソッドのみを公開し、親に直接アクセスすることはできません。

protected派生クラスは、アクセス修飾子として公開されている基本クラスのすべてのプロパティ、メソッド、およびメンバーにアクセスできます。

于 2012-10-23T18:45:00.487 に答える
0

「親」は「ベース」の同義語であり、「子」は「派生」の同義語ですが、「親」と「子」は一般的ではなく、あまり技術的ではありません(IMOのサウンドはあまり良くありません)。他の2つの用語は、「スーパークラス」と「サブクラス」です。

于 2012-10-23T18:46:17.653 に答える
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 に答える