4

プライベート継承はC++でサポートされており、パブリック継承のみがC#でサポートされていることを知っています。また、プライベート継承は通常、クラス間のHAS-A関係と一種の集約関係を定義するという記事に出くわしました。

編集:プライベート継承のC ++コード:「Carhas-a Engine」の関係は、プライベート継承を使用して表現することもできます。

class Engine {
 public:
   Engine(int numCylinders);
   void start();                 // Starts this Engine
 };

class Car : private Engine {    // Car has-a Engine
 public:
   Car() : Engine(8) { }         // Initializes this Car with 8 cylinders
   using Engine::start;          // Start this Car by starting its Engine
 };

さて、私が知りたいことの1つであるC#クラス間のHAS-A関係を作成する方法はありますか?

もう1つの興味深い質問は、C#がプライベート(および保護された)継承をサポートしないのはなぜですか?-複数の実装の継承をサポートすることは、正当な理由またはその他の理由ではありませんか?

プライベート(および保護された)継承は、C#の将来のバージョンで計画されていますか?

C#でプライベート(および保護された)継承をサポートすることで、C#はより優れた、広く使用されている言語になりますか?

4

2 に答える 2

14

さて、私が知りたいことの 1 つである C# クラス間の HAS-A 関係を作成する方法はありますか?

1 つのクラスに他のクラスのフィールドを持たせる:

class Car
{
    Engine engine;
}

車にはエンジンがあります。

もう 1 つの興味深い質問は、C# が非公開 (および保護された) 継承をサポートしないのはなぜですか?

地下室に箱があります。あなたは一度もそこに何かを入れたことはありません。誰かがあなたに「なぜこの箱は空なの?」と尋ねます。誰も何も入れていないので、箱は空であるという以外に、あなたはどのような答えを与えることができますか?

C# は非公開または保護された継承をサポートしていません。その機能を実装して顧客に出荷したことがないからです。機能はデフォルトでは無料で実装されていません。C# をプライベートで保護された継承から始めて、正当な理由で削除したわけではありません。これらの機能は最初からありませんでしたし、当然のことながら、まだありません。機能自体は成長しません。

複数の実装の継承をサポートしていないのは正当な理由ですか?

質問がわかりません。

プライベート (および保護された) 継承は、C# の将来のバージョンで計画されていますか?

いいえ。

C# でプライベート (およびプロテクト) 継承をサポートすると、現在よりも優れた言語になりますか?

私はそうは思わない。

OOP でよく見られる継承に関する多くの問題の 1 つは、「一種の」セマンティック関係と「実装の詳細を再利用する」メカニズム関係を完全に混同してしまうことです。プライベート継承は、この問題に部分的に対処します。

C# でプライベート継承を使用したい状況がいくつかあります。最近の例は、一般的に構築することはできたが、ユーザーに公開したくないデータ構造を持っていたことです。

internal class FancyDataStructure<T> {...}

T が int の場合にのみシリアル化できます (議論とは関係のない理由で)。

public class SerializableThingy : private FancyDataStructure<int>

代わりにFancyDataStructure<T>ネストされたタイプを作成し、SerializableThingy継承ではなく合成を使用しました。少量の「配管」コードを書く必要がありましたが、問題なく動作しました。

機能を追加するだけでは採算が合わないと思います。些細な配管税を回避するという非常に小さな利点と引き換えに、言語に複雑さが追加されます。

C# でプライベート (および保護された) 継承をサポートすると、現在よりも広く使用される言語になるでしょうか?

どうすれば私や他の誰かがその質問に対する答えを知ることができるでしょうか? StackOverflow は、反事実に基づく未来の予測を必要とする質問をするのに適していません。私の提案:

  • 必要な機能を備えたバージョンの C# を実装します。それが人気になるかどうかを確認してください。そしたらわかる。
  • 物事が今と違っていたら未来がどうなるかを予測できる超能力を持った人を見つけましょう。反事実に基づく予測は、演繹論理の規則によって自動的に真になるため、予測は正確になります。
于 2011-11-17T17:43:29.380 に答える
1

通常の方法で Has-a 関係を作成します。あるクラスに別のクラスのインスタンス メンバーを含めます。

C++ では、通常は親メソッド/インターフェイスへのアクセスを簡単にするために、実装された関係を表すためにプライベート継承が使用されることがあります。特に構成がかなり類似した機能を提供する場合は、C# がそれを提供しないことをあまり心配しないほど、おそらく十分にまれな使用です。

于 2011-11-17T17:45:54.017 に答える