タグ付けされた質問 「abstract-class」

抽象クラスは、インスタンス化できないクラスです。それらは一般に拡張/サブクラスであることが意図されており、一般にサブクラスによって実装されなければならない「抽象メソッド」を持っています。

7
C#で拡張メソッドを持つインターフェイスの代わりに抽象クラスを使用する場合
「抽象クラス」と「インターフェース」は類似した概念であり、インターフェースはより抽象的な概念です。1つの差別化要因は、抽象クラスが必要なときに派生クラスのメソッド実装を提供することです。ただし、C#では、この差別化要因は、インターフェイスメソッドの実装を提供できる拡張メソッドの最近の導入によって削減されました。別の差別化要因は、クラスが1つの抽象クラスのみを継承できる(つまり、多重継承がない)が、複数のインターフェイスを実装できることです。これにより、インターフェイスの制限が緩和され、柔軟性が高まります。それでは、C#では、拡張メソッドを備えたインターフェイスの代わりに抽象クラスをいつ使用すべきでしょうか? インターフェイス+拡張メソッドモデルの注目すべき例はLINQです。ここではIEnumerable、多数の拡張メソッドを介して実装されるすべてのタイプに対してクエリ機能が提供されます。

9
クラスを抽象クラスとして宣言する必要があるのはなぜですか?
私は構文、抽象クラスに適用されるルールを知っており、抽象クラスの使用法を知りたい 抽象クラスは直接インスタンス化できませんが、他のクラスによって拡張できます そうすることの利点は何ですか? インターフェースとどう違うのですか? 1つのクラスで複数のインターフェイスを実装できるが、1つの抽象クラスしか拡張できないことを知っています。インターフェイスと抽象クラスの違いはそれだけですか? インターフェースの使用法を知っています。JavaでのAWTのイベント委任モデルからそれを学びました。 どのような状況でクラスを抽象クラスとして宣言する必要がありますか?その利点は何ですか?

4
C ++では、仮想関数はなぜそしてどのように遅いのですか?
誰でも詳細に、仮想テーブルが正確にどのように機能するか、仮想関数が呼び出されたときにどのポインターが関連付けられるかを詳細に説明できますか。 実際に遅い場合、仮想関数の実行にかかる時間が通常のクラスメソッドよりも長いことを示すことができますか?いくつかのコードを見なくても、どのように/何が起こっているのかを簡単に見失うことがあります。

2
純粋な抽象クラスとインターフェースの実装
これはC ++標準では必須ではありませんが、たとえばGCCが純粋な抽象クラスを含む親クラスを実装する方法は、問題のクラスのすべてのインスタンス化にその抽象クラスのvテーブルへのポインタを含めることです。 当然、これは、このクラスのすべてのインスタンスのサイズを、それが持つすべての親クラスのポインターによって膨張させます。 しかし、多くのC#クラスと構造体には、基本的に純粋な抽象クラスである多くの親インターフェイスがあることに気付きました。sayのすべてのインスタンスがDecimal、さまざまなインターフェースすべてへの6つのポインターで肥大化していた場合、私は驚くでしょう。 それで、C#がインターフェースを異なる方法で実行する場合、少なくとも典型的な実装では、どのようにインターフェースを実行しますか(標準自体はそのような実装を定義しないかもしれません)。また、純粋な仮想親をクラスに追加するときに、C ++の実装にオブジェクトサイズの膨張を回避する方法がありますか?

4
定義としてC#の抽象クラスを使用する
C ++開発者として、私はC ++ヘッダーファイルに非常に慣れており、コード内に何らかの「ドキュメント」を強制することが有益であることがわかりました。そのため、私は通常、C#コードを読む必要があるときに悪い時間を過ごします。私が作業しているクラスのそのようなメンタルマップを持っていません。 ソフトウェアエンジニアとして、プログラムのフレームワークを設計していると仮定しましょう。C ++ヘッダーで行うのと同様に、すべてのクラスを抽象的な未実装クラスとして定義し、開発者に実装させるのはあまりにもクレイジーでしょうか? 誰かがこれをひどい解決策だと思う理由がいくつかあるのではないかと推測していますが、その理由はわかりません。このようなソリューションでは、何を考慮する必要がありますか?

3
パブリックメンバーを仮想化または抽象化しないでください-本当にですか?
2000年代に、私の同僚は、パブリックメソッドを仮想または抽象化するのはアンチパターンだと言っていました。 たとえば、彼は次のようなクラスはうまく設計されていないと考えました。 public abstract class PublicAbstractOrVirtual { public abstract void Method1(string argument); public virtual void Method2(string argument) { if (argument == null) throw new ArgumentNullException(nameof(argument)); // default implementation } } 彼は言った 実装Method1およびオーバーライドする派生クラスの開発者はMethod2、引数の検証を繰り返す必要があります。 場合には、基本クラスの開発者は、カスタマイズの一部の周りに何かを追加することを決定しMethod1たりMethod2、後で、彼はそれを行うことはできません。 代わりに、私の同僚がこのアプローチを提案しました: public abstract class ProtectedAbstractOrVirtual { public void Method1(string argument) { if (argument == null) throw new …

5
列挙型は脆弱なインターフェースを作成しますか?
以下の例を考えてください。ColorChoice列挙の変更は、すべてのIWindowColorサブクラスに影響します。 列挙型は脆弱なインターフェースを引き起こす傾向がありますか?多態的な柔軟性を可能にする列挙型よりも優れたものはありますか? enum class ColorChoice { Blue = 0, Red = 1 }; class IWindowColor { public: ColorChoice getColor() const=0; void setColor( const ColorChoice value )=0; }; 編集:私の例として色を使用して申し訳ありませんが、それは質問についてのものではありません。これは、ニシンを避け、柔軟性の意味についてより多くの情報を提供する別の例です。 enum class CharacterType { orc = 0, elf = 1 }; class ISomethingThatNeedsToKnowWhatTypeOfCharacter { public: CharacterType getCharacterType() const; void setCharacterType( const CharacterType …

2
抽象例外スーパータイプ
投げることSystem.Exceptionがとても悪いと考えられるなら、そもそもなぜException行わabstractれなかったのですか? そうすれば、以下を呼び出すことはできません。 throw new Exception("Error occurred."); これにより、派生した例外を使用して、発生したエラーに関する詳細を提供することができます。 たとえば、ライブラリのカスタム例外階層を提供する場合、通常、例外の抽象基本クラスを宣言します。 public abstract class CustomExceptionBase : Exception { /* some stuff here */ } そして、より具体的な目的を持ついくつかの派生した例外: public class DerivedCustomException : CustomExceptionBase { /* some more specific stuff here */ } 次に、ライブラリメソッドを呼び出すときに、この汎用try / catchブロックを使用して、ライブラリからのエラーを直接キャッチできます。 try { /* library calls here */ } catch (CustomExceptionBase ex) …

4
共通フィールドを基本クラスに移動するタイミングは?
現在、2つの派生クラスがAあり、B、両方に共通のフィールドがあり、基本クラスに入れるかどうかを判断しようとしています。 基本クラスから参照されることはありません。また、道路のある時点で別のクラスが派生した場合C、を持たない場合、_field1「最低特権」(または何か)のプリンシパルは違反されませんだった? public abstract class Base { // Should _field1 be brought up to Base? //protected int Field1 { get; set; } } public class A : Base { private int _field1; } public class B : Base { private int _field1; } public class C : Base { // …

6
抽象クラス、インターフェースの違い、およびそれらをいつ使用するか
最近、私は頭をOOPに巻きつけ始めました。そして今、抽象クラスとインターフェースの違いについて読むほど、混乱してしまいます。これまでのところ、どちらもインスタンス化できません。インターフェースは多かれ少なかれ構造的な青写真であり、スケルトンを決定し、抽象は部分的にコードを実装できることによって異なります。 私の特定の状況を通して、これらについてもっと学びたいです。背景情報をもう少し知りたい場合の最初の質問へのリンクは次のとおりです。新しいクラスに適した設計モデルは何ですか? ここに私が作成した2つのクラスがあります。 class Ad { $title; $description $price; function get_data($website){ } function validate_price(){ } } class calendar_event { $title; $description $start_date; function get_data($website){ //guts } function validate_dates(){ //guts } } ご覧のとおり、これらのクラスはほぼ同じです。ここに示されているが、他の機能があるではないlike get_zip()、save_to_database()私のクラスで共通しています。また、すべての一般的なメソッドと、もちろんそれらのクラスに固有のプロパティ(マイレージ、重量など)を持つ他のクラスのCarsとPetsを追加しました。 現在、DRYの原則に違反しており、複数のファイルにわたって同じコードを管理および変更しています。私は、ボート、馬、またはその他のようなクラスを増やすつもりです。 これは、インターフェイスまたは抽象クラスを使用する場所ですか?抽象クラスについて理解していることから、抽象クラスにすべての共通要素が組み込まれたテンプレートとしてスーパークラスを使用し、将来のクラスで特に必要な項目のみを追加します。例えば: abstract class content { $title; $description function get_data($website){ } function common_function2() { } function common_function3() …

6
インターフェイスメソッドを抽象メソッドと見なすことはできますか?
私はそれについて考えていた、と私はいくつかの疑問がありました。 たとえば、インターフェイスを宣言するとき: public interface MyInterface { public void method1(); public void method2(); } これらのインターフェイスメソッドは抽象と見なされますか?つまり、抽象メソッドの概念は次のとおりです。 抽象メソッドは宣言されたメソッドですが、実装は含まれていません。 だから、これらのメソッドは抽象的と見なすことができますか?私はabstract言葉を使っていないので、それらは「純粋な」抽象メソッドではありませんが、概念的にはそうであるように見えます。 それについて何か教えていただけますか? ありがとう。

3
インターフェイスを直接実装するか、スーパークラスに実装させる必要がありますか?
違いはありますか public class A extends AbstractB implements C {...} 対... public class A extends AbstractB {...} abstract class AbstractB implements C {...} どちらの場合でも、クラスAがインターフェースに準拠することになることを理解しています。2番目のケースでAbstractBは、のインターフェイスメソッドの実装を提供できますC。それが唯一の違いですか? のインターフェイスメソッドの実装を提供したくない場合 AbstractB、どのスタイルを使用する必要がありますか?どちらか一方を使用すると、何らかの「文書化」の目的が隠されますか?

5
静的メソッドをオーバーライドできないのはなぜですか?
この質問への回答で、一般的なコンセンサスは、静的メソッドはオーバーライドされることを意図していないということでした(したがって、C#の静的関数は仮想または抽象にできません)。ただし、これはC#の場合だけではありません。Javaもこれを禁止しており、C ++もそれを好まないようです。ただし、子クラスでオーバーライドしたい静的関数(ファクトリーメソッドなど)の多くの例を考えることができます。理論的には、それらを回避する方法がありますが、それらはどれもきれいでも単純でもありません。 静的関数をオーバーライドできないのはなぜですか?

4
C ++とJavaの抽象クラス/インターフェースには異なる使用原理がありますか
Herb Sutterによると、実装を可能な限り分離するために、C ++の抽象クラスよりも抽象インターフェイス(すべて純粋な仮想関数)を好むはずです。私は個人的にこのルールが非常に役立つと感じていますが、最近、多くのJavaプログラマーとチームに参加しましたが、Javaコードにはこのガイドラインは存在しないようです。関数とその実装は、非常に頻繁に抽象クラスに配置されます。だから、C ++でさえハーブサッターをすべて間違っているのか、それともJavaと比較してC ++の抽象関数の使用に一般的な違いがあるのか​​。実装コードを持つ抽象クラスは、C ++よりもJavaの方が賢明ですか?

7
シングルトン、抽象クラス、インターフェースの役割は何ですか?
私はC ++でOOPを勉強しており、これら3つの概念の定義を知っていても、それをいつどのように使用するかを本当に理解できません。 このクラスを例に使用してみましょう。 class Person{ private: string name; int age; public: Person(string p1, int p2){this->name=p1; this->age=p2;} ~Person(){} void set_name (string parameter){this->name=parameter;} void set_age (int parameter){this->age=parameter;} string get_name (){return this->name;} int get_age (){return this->age;} }; 1. シングルトン クラスが1つのオブジェクトのみを機能させるという制限はどのように機能しますか? CANあなたは持っているだろう、クラス設計ONLY 2のインスタンスを?それとも3? WHEN /必要な推奨シングルトンを使用していますか?それは良い習慣ですか? 2. 抽象クラス 私の知る限り、純粋な仮想関数が1つしかない場合、クラスは抽象になります。だから、追加 virtual void print ()=0; しますよね? なぜあなたは、そのオブジェクト必要とされていないクラスが必要でしょうか? …

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