1

基本クラスから継承する場合、「基本クラスの機能/メソッドのすべて(またはX%)を実装/使用する必要がある場合にのみ継承する」というルールはありますか?私が継承する場合、私は多くを継承していることを理解していますが、それは私がそれをすべて使用しなければならないという意味ではありません。

次のパターンを想定します。

public abstract class Template
{   
    public void LoadCustomer()
    {
        //Load customer logic
    }
    public virtual void LoadGrid()
    {
        //Logic   
    }
    public virtual void other()
   { //logic }

    public virtual void other2()
   { //logic }

    public virtual void other3()
   { //logic }

    public string WelcomeMessage()
    {
         //perform lots of complex logic
         return "Hello and welcome";
    }
}

アプリケーションの一部でWelcomeMessage()のみを表示したい場合、上記のTemplateクラスから継承するのは間違っているでしょうか(継承できるのは1回だけですが、この質問の要因ではありません)(また、注意してください)意図的に抽象的なメソッド/フィールドは含まれていません)。

4

4 に答える 4

3

私は「光を見た」前に、かなりの数のプロジェクトでこの道を進みました。

「基本クラスの機能/メソッドのすべて(またはX%)を実装/使用する必要がある場合にのみ継承する」というルールはありますか?

はいといいえ。いいえ、ルールはありませんが、やりたいことをする方法はあります。これは、継承よりも構成を優先することを意味します。つまり、機能の各ブロックを1つのクラスに分割し、(現在のサブクラスで)そのクラスのインスタンスを作成して、必要な作業を委任する必要があります。それに。この手法を使用すると、現在のサブクラスに波及効果を与えることなく、現在のスーパークラスに簡単に変更を加えることができます。

結論として、疑わしい場合(または単に面白く感じる場合)は、継承を使用しないでください。これは、すべてのサブクラスがそのスーパークラスの完全かつ適切な代替である必要があると述べているリスコフの置換原則によって具体化されます。(つまり、両方が人を運ぶことができるという理由だけでBoatサブクラスはありません)。Plane

もっと楽しく読むには、 SOLIDソフトウェアエンジニアリングパラダイムをチェックしてください。

于 2012-10-04T09:21:53.353 に答える
2

抽象クラスの問題は、どのメソッドとプロパティがその中にあるかということです。すべての子孫がその中のすべてのメソッドをオーバーライドする場合、それは優れた設計です。代わりにインターフェースを同じように簡単に使用できますが。コントラクト(メソッドシグネチャ)を定義するだけでなく、いくつかのデフォルトの動作を実装する場合は、抽象クラスの方が適しています。

ToString()を考えてみてください。オーバーライドしないと、クラス名が返されます。

子孫の小さなサブセットでメソッドをオーバーライドするためだけに抽象クラスにメソッドを追加していることに気付いた場合、それは間違った選択です。

これは私のインスタンスに戻ってきました。

私の経験では、抽象基本クラスは、それが定義するコントラクトが要件によって修正されている場合にのみ使用する必要があることを示唆しています。それがどのように行うかではなく、それが行うことの変更の可能性がたくさんある場合は、それに近づかないでください。

于 2012-10-04T09:26:42.667 に答える
1

ここでの問題は、継承自体ではなく、テンプレートクラスが悪い 神オブジェクトのように見えることです。

それが、そのクラスから継承することが間違っていると感じる理由です。

于 2012-10-04T09:12:25.740 に答える
1

継承を使用する場合と使用しない場合には、実際にいくつかの良い点があります。最初にこの記事を読む必要があります:

http://msdn.microsoft.com/en-us/library/27db6csx(v=vs.80).aspx

于 2012-10-04T09:17:12.510 に答える