タグ付けされた質問 「inheritance」

継承は、プログラミング言語のサポートに応じて、既存のオブジェクトのコードを再利用したり、既存のオブジェクトからサブタイプを確立したりする方法です。

9
継承のための設計はどのように余分なコストを引き起こすことができますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 だから私はsealed classインシャープから継承したいと思い、やけどを負った。ソースにアクセスできない限り、封印を解除する方法はありません。 それから、「なぜsealed存在するのか」と考えさせられました。4ヶ月前。次のような多くのことを読んだにもかかわらず、私はそれを理解できませんでした。 Jon Skeetの願いは、「クラスは.NETでデフォルトで封印されました。」 継承よりも構成を優先しますか? 「すべてのクラスを封印するべきではありません(...)」 Sealedクラスをどのようにモックしますか? それ以来、すべてを消化しようとしましたが、それは私にとってはやりすぎです。最終的に、昨日私はそれをもう一度試しました。私はそれらすべてをもう一度スキャンし、さらにいくつかをスキャンしました: クラスが「抽象」または「最終/封印」以外のものでなければならないのはなぜですか? 15年以上のプログラミングで、すでにリンクされている質問からの答えのうち、最初にSOLIDを聞いたことがあり、明らかに4ヶ月前にそれをすべて読んでいませんでした 最後に、熟考した後、新しいタイトルに基づいて元の質問を大幅に編集することにしました。 古い質問が広すぎると主観的でした。それは基本的に尋ねていました: 旧称:シールを使用する1つの正当な理由 本文:シールクラスを適切に変更する方法 継承を忘れますか?コンポジションを使用しますか? しかし、今、理解すること(私は昨日なかった)すべてのsealed継承を阻止されず、そして私たちは、実際に使用する必要がありますすることができます継承上の組成を、私は私がした必要なものを実現実用例。 私はここに私の質問は正確に何を(実際には常にされている)であると思いMr.Mindorはチャットで私の提案:どのように余分なコストの原因継承のために設計することができますか?
12 c#  inheritance 

2
JavaがC ++のようなプライベート/保護された継承をサポートしないのはなぜですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 C ++でクラスを継承している間、ユーザーは次のようなアクセス指定子を指定できます。 class Base { public int mem1; protected in mem2; }; class Derived1 : **private** Base { // mem1 will be private here. // mem2 will be private here. }; class Derived2 : **protected** Base { // mem1 will be protected here. // mem2 will be protected …

4
並列階層-部分的に同じ、部分的に異なる
似たような質問がたくさんあります 1、2、3、4、ただし、この質問ではnonは当てはまらないようであり、解は最適とは思われません。 これは一般的なOOPの質問であり、多態性、ジェネリック、およびミックスインが利用可能であると仮定しています。実際に使用される言語はOOP Javascript(Typescript)ですが、JavaまたはC ++でも同じ問題です。 並列クラス階層があり、同じ動作(インターフェイスと実装)を共有することもありますが、それぞれに独自の「保護された」動作があります。次のように説明します。 これは、説明のみを目的としています。実際のクラス図ではありません。それを読むには: 共通階層(中心)のすべては、Canvas(左)階層とSVG(右)階層の両方で共有されます。シェアとは、インターフェースと実装の両方を意味します。 左または右の列にのみあるものは、その階層に固有の動作(メソッドとメンバー)を意味します。例えば: 左右の階層は、まったく同じ検証メカニズムを使用しViewee.validate()ます。これは、共通の階層で単一のメソッド()として示されています。 キャンバス階層のみにメソッドがありpaint()ます。このメソッドは、すべての子に対してpaintメソッドを呼び出します。 SVG階層はのaddChild()メソッドをオーバーライドする必要がありますCompositeが、キャンバス階層の場合はそうではありません。 両側の階層の構造を混在させることはできません。工場はそれを保証します。 解決策I-継承を離れる Fowler's Tease Apart Inheritanceは、2つの類似点の間に矛盾があるため、ここでは役に立たないようです。 解決策II-ミックスイン これは私が現在考えることができる唯一のものです。2つの階層は別々に開発されますが、各レベルでクラスはクラス階層の一部ではない共通クラスに混在します。structuralフォークを省略すると、次のようになります。 各列は独自の名前空間にあるため、クラス名は競合しません。 質問 誰でもこのアプローチで障害を見ることができますか?誰もがより良い解決策を考えることができますか? 補遺 これがどのように使用されるかを示すサンプルコードを次に示します。名前空間svgは次のように置き換えられますcanvas: var iView = document.getElementById( 'view' ), iKandinsky = new svg.Kandinsky(), iEpigone = new svg.Epigone(), iTonyBlair = new svg.TonyBlair( iView, iKandinsky ), iLayer = new svg.Layer(), …

5
このシナリオで構成または継承を優先すべきですか?
インターフェイスを考えてみましょう: interface IWaveGenerator { SoundWave GenerateWave(double frequency, double lengthInSeconds); } このインターフェイスは、さまざまな形状の波を生成するいくつかのクラス(SineWaveGeneratorおよびなどSquareWaveGenerator)によって実装されます。 SoundWave生のサウンドデータではなく、音楽データに基づいてを生成するクラスを実装したいと思います。それは音の名前と拍数(秒ではない)の長さを受け取り、内部的にIWaveGenerator機能を使用してSoundWaveそれを作成します。 質問は、「をNoteGenerator含むIWaveGeneratorべきIWaveGeneratorですか、それとも実装から継承すべきですか?」 次の2つの理由から、作曲に傾倒しています。 1- 動的に任意のIWaveGeneratorものを注入できNoteGeneratorます。またNoteGenerator、、などSineNoteGeneratorでSquareNoteGeneratorはなく、1つのクラスのみが必要です。 2-でNoteGenerator定義された下位レベルのインターフェースを公開する必要はありませんIWaveGenerator。 しかし、私はこれに関する他の意見を聞くためにこの質問を投稿しています。おそらく考えていない点です。 ところで:私はそれがsを生成するため、概念的に言うNoteGenerator と思います。IWaveGeneratorSoundWave

5
突然変異法のための独立したインターフェース
私はいくつかのコードのリファクタリングに取り組んできましたが、ウサギの穴を降りる最初の一歩を踏み出したのではないかと思います。私はJavaで例を書いていますが、それは不可知論的であると思われます。 次のようにFoo定義されたインターフェイスがあります public interface Foo { int getX(); int getY(); int getZ(); } そして、実装として public final class DefaultFoo implements Foo { public DefaultFoo(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public int getX() { return x; } public int getY() { …

9
使用するOOデザイン(デザインパターンはありますか?)
「バー/クラブ」(あなたが飲む/社交する場所)を表す2つのオブジェクトがあります。 あるシナリオでは、バーの名前、住所、距離、スローガンが必要です 別のシナリオでは、バー名、住所、ウェブサイトのURL、ロゴが必要です したがって、同じものを表すが異なるフィールドを持つ2つのオブジェクトがあります。 不変オブジェクトを使用するのが好きなので、すべてのフィールドはconstructorから設定されます。 1つのオプションは、2つのコンストラクターを持ち、他のフィールドをヌルにすることです。 class Bar { private final String name; private final Distance distance; private final Url url; public Bar(String name, Distance distance){ this.name = name; this.distance = distance; this.url = null; } public Bar(String name, Url url){ this.name = name; this.distance = null; this.url = url; …

5
RealNumberおよびComplexNumber継承を実装する方法は?
うまくいけば、あまりにも学術的ではありません... SWライブラリに実数と複素数が必要だとしましょう。 is-a(またはhere)関係に基づいて、実数は複素数であり、複素数の虚数部のbは単に0です。 一方、私の実装は、その子は親を拡張するため、親のRealNumberには実数部があり、子ComplexNumberには架空のアートが追加されます。 また、相続は悪だという意見もあります。 昨日のように、私が大学でOOPを学んでいたとき、私の教授は、これらの2つの絶対値が異なる方法で計算されるため、これは継承の良い例ではないことを思い出します(ただし、そのためにメソッドのオーバーロード/ポリモーフィズムがありますよね?)。 。 私の経験では、継承を使用してDRYを解決することがよくあります。その結果、階層に人工的な抽象クラスが含まれることがよくあります(実際のオブジェクトを表さないため、名前を見つけるのに問題があることがよくあります)。

5
LSPに違反しても大丈夫ですか?
私はこの質問についてフォローアップしていますが、コードから原則に焦点を移しています。 Liskov置換原理(LSP)についての私の理解から、私の基本クラスにあるメソッドは何でも、それらは私のサブクラスに実装する必要があります。このページによれば、基本クラスのメソッドをオーバーライドし、何も実行しないか、例外、あなたは原則に違反しています。 さて、私の問題は次のようにまとめることができます:私は抽象Weapon classと2つのクラス、Swordとを持っていReloadableます。と呼ばれるReloadable特定のが含まれている場合、それにアクセスするにはダウンキャストする必要があります。理想的には、それを回避する必要があります。methodReload()method 次に、を使用することを考えましたStrategy Pattern。このように、各武器は実行可能なアクションのみを認識していたため、たとえば、Reloadable武器は明らかにリロードSwordできますが、リロードすることはできませんReload class/method。Stack Overflowの投稿で述べたように、ダウンキャストする必要はなく、List<Weapon>コレクションを維持できます。 で別のフォーラム、最初の答えができるようにする提案Swordを認識するReloadだけで何もしません、。これと同じ答えが、上でリンクしたスタックオーバーフローのページにもありました。 理由はよくわかりません。なぜ原則に違反し、Swordにを認識さReloadせ、空白のままにするのですか?Stack Overflowの投稿で述べたように、SPで問題がほぼ解決しました。 なぜそれが実行可能な解決策ではないのですか? public final Weapon{ private final String name; private final int damage; private final List<AttackStrategy> validactions; private final List<Actions> standardActions; private Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks) { this.name = name; this.damage = damage; standardActions = new …

1
単純な構成の代わりに弱参照を使用した方がよい状況はありますか?
が、Javaのドキュメントを指定し、その弱参照は、主にマッピングをcanonicalizingために、あなたが見つけるされている多くの、多くの、多くのWeakHashMapは、その存続期間中にオブジェクト・メタデータを格納するための完璧であることを、述べてインターネット上の人々を。ただし、誰もがわかりやすく適切な例を作成することに煩わされることはありません。 WeakHashMapを使用してオブジェクトにいくつかのプロパティを追加するか、メタデータサウンドを格納します。言い換えれば、悪いデザインです。継承が利用できない場合があることを理解しています(最終的なクラス、インターフェース)が、構成についてはどうですか?合成が選択肢にならない一例は考えられません。「言語の癖」ではなく、確立された原則に依存しているので、確かにより良いものです。 それでは、単純な構成の代わりに弱参照を使用した方がよい状況はありますか?そうでない場合、なぜインターネット上の誰もがそれを誤解しているように見えるのですか?

2
Pythonの継承は「is-a」の継承スタイルですか、それともコンポジションスタイルですか?
Pythonが複数の継承を許可する場合、Pythonの慣用的な継承はどのように見えますか? Javaのように単一継承の言語では、あるオブジェクトが別のオブジェクトの「is-a」であり、オブジェクト間でコードを共有したい場合(親オブジェクトから子オブジェクトまで)は、継承が使用されます。たとえば、それDogはAnimal: public class Animal {...} public class Dog extends Animal {...} しかし、Pythonは多重継承をサポートしているため、他の多くのオブジェクトを組み合わせてオブジェクトを作成できます。以下の例を検討してください。 class UserService(object): def validate_credentials(self, username, password): # validate the user credentials are correct pass class LoggingService(object): def log_error(self, error): # log an error pass class User(UserService, LoggingService): def __init__(self, username, password): self.username = username self.password = password …

3
継承:スーパークラスからのコードは実質的にサブクラスに「コピー」されますか、それともサブクラスによって参照されますか?
Class SubはclassのサブクラスですSup。それは実際にはどういう意味ですか?言い換えれば、「継承」の実際的な意味は何ですか? オプション1: Supのコードが仮想的にSubにコピーされます。( 'copy-paste'と同じですが、コピーされたコードがサブクラスで視覚的に表示されていません)。 例:methodA()はもともとSupにあったメソッドです。SubはSupを拡張するのでmethodA()、(事実上)Subにコピーペーストされます。これで、Subにはという名前のメソッドがありmethodA()ます。コードのすべての行でSupと同じですmethodA()が、完全にSubに属しており、Supに依存していないか、何らかの方法でSupに関連しています。 オプション2: Supからのコードは実際にはSub にコピーされません。それはまだスーパークラスだけにあります。ただし、そのコードはサブクラスを介してアクセスでき、サブクラスで使用できます。 例:methodA()は、Supのメソッドです。SubはSupを拡張するのでmethodA()、Subから次のようにアクセスできますsubInstance.methodA()。しかし、実際methodA()にはスーパークラスで呼び出されます。つまり、methodA()は、サブクラスによって呼び出された場合でも、スーパークラスのコンテキストで動作します。 質問:2つのオプションのどちらが実際に機能するのですか?どれもない場合は、これらが実際にどのように機能するかを説明してください。

12
「メソッドを変更せずに再利用する場合は、メソッドを基本クラスに配置し、それ以外の場合はインターフェースを作成する」というのは良い経験則ですか?
私の同僚は、基本クラスとインターフェイスのどちらを作成するかを選択するための経験則を考え出しました。 彼は言う: 実装しようとしているすべての新しいメソッドを想像してみてください。それらのそれぞれについて、このことを考慮してください。この方法は、内の複数のクラスによって実装されます正確にせずに、このフォームの任意の変化?答えが「はい」の場合は、基本クラスを作成します。他のすべての状況では、インターフェースを作成します。 例えば: クラスを検討catしてdogクラスを拡張し、mammal単一の方法を持っているがpet()。次に、alligator何も拡張せず、1つのメソッドを持つクラスを追加しslither()ます。 次に、eat()それらすべてにメソッドを追加します。 実装した場合eat()の方法は、のためにまったく同じになりcat、dogそしてalligator、私たちは、基本クラス(LETだと言う、作成する必要がありanimal、このメソッドを実装します)。 ただし、実装がalligator少しでも異なる場合は、IEatインターフェースを作成して作成mammalおよびalligator実装する必要があります。 彼はこの方法がすべてのケースをカバーすると主張しますが、私には過度に単純化しているようです。 この経験則に従う価値はありますか?

2
プロトタイプを作成するときにコンストラクターの使用が推奨されないのはなぜですか?
背景: JavaScriptでは、各オブジェクトタイプのコンストラクター関数にprototypeプロパティがあります。prototypeオブジェクトを参照する、そのプロトタイプチェーン内の次のステップアップとしてそれぞれ構成されたオブジェクトの使用。あるタイプを別のタイプから組み込みたい場合prototypeは、子タイプのを親タイプの新しいインスタンスに設定できます。 例えば: var Parent = function() { /* constructor business */ } Parent.prototype.parentProp = "some parent property"; var Child = function() { /* constructor business */ } Child.prototype = /*** !! Some prototype object goes here !! ***/ 私の質問はSome prototype object goes here、上記のコードの「」の場所にどのコードを配置する必要があるかを尋ねています。私の最初の本能は親のインスタンス(つまりnew Parent())を構築することですが、これはあるオブジェクトのプロトタイプを別のオブジェクトのプロトタイプにコピーする安全な方法ですか?、1人のユーザーが書き込みます: いいえ、new bar()プロトタイプオブジェクトには使用しないでください。 (...これは多くのSOの回答やコメントで見た意見ですが、これが現時点で手にしている唯一の例です。) もう1つのオプションは、Object.create(Parent.prototype)として使用することChild.prototypeです。私の知る限り、これによって新しいParentインスタンスも作成されますが、Parentコンストラクターは実行されません。 親タイプからプロトタイプオブジェクトを生成するときにコンストラクタ関数の実行を回避する必要がある理由を誰かが説明できますか?(おそらく複数の継承レベルで)発生するいくつかの重大な技術的問題はありますか?または、そのようなパターンは、プロトタイプのベストプラクティスと衝突するコンストラクタの誤用ですか(たとえば、プロトタイプの作成時にコンストラクタを実行すると、懸念の分離に違反します)?

6
なぜサブクラス化があまりにも悪いのですか(そして、なぜプロトタイプを使用してそれを排除する必要があるのですか)?
私はデザインパターンについて調べていましたが、プロトタイプのデザインパターンでは、過度のサブクラス化をなくすことができました。 サブクラス化が悪いのはなぜですか?プロトタイプを使用すると、サブクラス化に対してどのような利点がありますか?

1
Groovyの特性、継承、インターフェース、いつ使用するのですか?
私はGroovyを学んでいて、2.3で追加された新機能であるTraitsの追加について学びました。今の私には、Traitsを使用すると、基本的にスーパークラスとインターフェイスで実行できるすべてのことを実行できるように見えます。 Groovyにトレイトを追加すると、継承とインターフェースが廃止されますか? そうでない場合、これらの各メカニズムを使用するのに最適な時期はいつですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.