私はオブジェクト指向プログラミングを学んでいますが、私は抽象クラスと具象クラスについて混乱しています。いくつかの現実の例が評価されます。そして、他のものを使うことの利点は何ですか?いつ抽象クラスと具体クラスを好むでしょうか?抽象クラスとコンクリートクラス?
答えは、あなたが抽象クラスを使用する必要がありますインスタンス化されていませしなければならないオブジェクトを持っている場合、私はRuby
私はオブジェクト指向プログラミングを学んでいますが、私は抽象クラスと具象クラスについて混乱しています。いくつかの現実の例が評価されます。そして、他のものを使うことの利点は何ですか?いつ抽象クラスと具体クラスを好むでしょうか?抽象クラスとコンクリートクラス?
答えは、あなたが抽象クラスを使用する必要がありますインスタンス化されていませしなければならないオブジェクトを持っている場合、私はRuby
の文脈の中で求めていますよりも、任意の言語に特有である場合。ただし、このクラスのインスタンスを作成する場合は、具象クラスを使用する必要があります。
いくつかの動物クラスが必要だと想像してください。しかし、ルールは、犬、猫、またはマウスのような特定の動物をインスタンス化することです。しかし、今ではそれらの動物のすべてがいくつかの特性と方法を共有しています。したがって、コードの重複を避けるために、それらを基底クラスAnimal
に入れます。あなたはしかしAnimal
のインスタンスを作成することはできません。
public abstract class Animal
{
public string Name { get; set; }
public void Sleep()
{
// sleep
}
}
public class Cat : Animal
{
public void Meow()
{
// meooooow
}
}
public void DoSomething()
{
var animal = new Animal(); // illegal operation
var cat = new Cat(); // works fine
}
まあ、何とか知っているのですが、そのコードの強調表示がひどく間違っているのはなぜですか?私は自分のコードで間違いを見つけることができません:S –
質問はそのようにタグ付けされているので、それはルビーだと私は信じています。あなたのコメントの最初のスラッシュを正規表現の始めとして解釈し、大文字の単語を定数として解釈します。 –
抽象クラスは、一般的に、具体的なクラスの基本クラスです。 (OO継承を介して派生)抽象クラスは通常、具象クラスのインタフェースを強制します。しかし、抽象クラスはメソッドと属性を介して具象クラスによって使用される共通の機能を実装することもできます。
抽象クラスをインスタンス化することはできませんが、必要なメソッドをすべて実装していると仮定すると、具体クラスをインスタンス化することしかできません。
"しかし、代わりに必要なメソッドのすべてを実装していると仮定して、具象クラスをインスタンス化することはできません。"私はそれがインタフェースのために正しいと思う。基本クラスから継承する具象クラスは、基本クラスのメンバを実装する必要はありません。これは、継承の呪いと同様に、メリットの1つです。 –
@ebeeb、そうです、私は抽象メソッドを実装することを指していました。 Rubyについてはわかりませんが、C++やJavaのような他の言語では抽象クラスから継承することができ、その抽象メソッドの一部だけを実装することができます(そのすべてではない)。しかし、あなたが抽象メソッドのすべてを実装していなければ、それはコンクリートクラスですか?たぶんその命名法の問題です。 – Brady
インスタンス化できるとすぐに具体的なクラスです。あなたが実装していなくても(ここでは "implement"は間違った単語です。右のものは "hide"になります)、ベースメンバーの1つです。具体的なクラスにメソッドを実装し、同じシグネチャを持つメソッドがすでに基底クラスに存在する場合は、基底クラスの実装を非表示にします。これを行う一般的な方法は、 'override'キーワードでオーバーライドすることができる、基本クラスの' virtual'メンバを経由する方法です。 –
これはあなたにいくつかの一般的なアイデアを与えるかもしれません...しかし、ルビーではありません... http://stackoverflow.com/questions/2149207/what-is-the-difference-between-a-concrete-class-and-an-抽象クラス – knurdy