2

抽象クラスを使い始めたばかりで、正しい方法で使用しているかどうかを知りたいです。私の例では、Form1がアプリのメインUIであるWindowsフォームアプリケーションがあります。Form1内に、デバッグメッセージをリッチテキストボックスに書き込むメソッドがあります。私は現在、メインUIのリッチテキストボックスにメッセージを書き戻すための同じメソッドを持つさまざまなクラスをたくさん持っています。ただし、この機能を抽象クラスの一部にするのが理にかなっているのではないかと思っていました。以下に示すように、他のすべてのクラスにこの機能を継承させるだけですか?

using System;
using System.Windows.Forms;

namespace abstractTest
{
    /// <summary>
    /// Main User Interface
    /// </summary>
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void RTBWriteLine(string message)
        {
            /* Print (append) message to the debug richtextbox */
            this.richTextBox1.AppendText(message + Environment.NewLine);

            /* Select the last entered message */
            this.richTextBox1.Select(richTextBox1.Text.Length, 0);

            /* Scroll to selected message */
            this.richTextBox1.ScrollToCaret();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 c1 = new Class1(this);
            Class2 c2 = new Class2(this);
        }
    }

    public abstract class absTest
    {
        protected Form1 MainUI;

        public virtual void MainRTBWriteLine(string msg)
        {
            if (MainUI != null)
            {
                MainUI.RTBWriteLine(msg);
            }
        }
    }

    public class Class1 : absTest
    {
        public Class1(Form callingForm)
        {
            MainUI = callingForm as Form1;
            MainRTBWriteLine("This is Class1");
        }
    }

    public class Class2 : absTest
    {
        public Class2(Form callingForm)
        {
            MainUI = callingForm as Form1;
            MainRTBWriteLine("This is Class2");
        }
    }
}

編集:私の主な目標は、DTBWriteLine(メインUIを更新する他の多くのメソッドの中で何らかの方法で)をすべてのクラスで使用できるようにすることですが、コードは1か所にしかありません。現在、私が作成したすべてのクラスで、(他の多くの中で)次のメソッドを複製しています。

public virtual void MainRTBWriteLine(string msg)
{
    if (MainUI != null)
    {
        MainUI.RTBWriteLine(msg);
    }
}

これを抽象クラスに入れることが最善のアプローチではない場合、何ですか?

4

6 に答える 6

3

はい、このシナリオは抽象クラスを使用するための完璧な例です。

継承ツリーで機能を共有している場合。

于 2013-01-13T20:28:41.393 に答える
1

私には、あなたが求めているのは別のDebugLoggerクラスであり、その唯一の関心事はデバッグメッセージをテキストボックスに記録することであるように思われます。

次に、他のクラスは、主要な機能とはあまり関係のないこの追加機能を継承するのではなく、デバッグログをこの1つのクラスに委任するだけです。

于 2013-01-13T20:52:18.500 に答える
1

はい、抽象クラスはこの状況での1つのオプションです。別の方法(特に他の場所から同じ機能を再利用したい場合)は、別のクラスにユーティリティメソッドを作成することです。継承はコードの再利用を実現する1つの方法ですが、常に最良の選択であるとは限りません。オプションを慎重に検討してください。

于 2013-01-13T20:30:48.260 に答える
0

それは理にかなっており、抽象クラスのアイデアを反映しています。あなたの例では、absTestの実装により、必要に応じて単一のポイントでロギング戦略を交換できるという関心の分離も提供されます。

于 2013-01-13T20:33:04.877 に答える
0

ドキュメントによると、抽象クラスのポイント:

クラス宣言でabstract修飾子を使用して、クラスが他のクラスの基本クラスになることのみを目的としていることを示します

  • 抽象クラスはインスタンス化できません。
  • 抽象クラスには、抽象メソッドとアクセサーが含まれる場合があります。
  • 封印された修飾子を使用して抽象クラスを変更することはできません。つまり、クラスを継承することはできません。
  • 抽象クラスから派生した非抽象クラスには、継承されたすべての抽象メソッドとアクセサーの実際の実装が含まれている必要があります。
于 2013-01-13T20:28:26.370 に答える
0

抽象クラスは、テンプレートメソッドパターンを実装するために広く使用されています。C#実装サンプルを確認してください。

abstractあなたの例では、正確にキーワードを使用する必要はないことを付け加えておきます。absTest害がないわけではなく、コンストラクターの実装abstractの場合は完全に機能します。absTest(Form callingForm)

于 2013-01-13T20:36:11.893 に答える