0

簡単な GUI アプリケーションをいくつか作成しましたが、基本的にすべてのロジックは、指定されたデフォルトの Form1 クラスに記述されています。

そこで、GUI ロジックを独自のクラスに書き直そうと思いました。たとえば、FileOpenDialog のクラス、ListView の別のクラスなどです。そうすれば、私の Form1 クラスにはあまり多くの不要なメソッドがなく、いくつかの基本的なものを処理するためだけに存在し、他の GUI メソッドが移動した後はおそらくそれほど多くはありません。

どこかにたどり着くための最初の試みとして、このようなものを書きました

namespace WindowsFormsApplication1
{
    class OpenFileDialog1 : OpenFileDialog
    {
    }
}

しかし、VS は、封印された型から派生させることはできないと教えてくれます。

他のクラスで試したことはありませんが、おそらくいつか同じ問題に遭遇するでしょう。私はそれを正しく継承していませんか?または、何らかの回避策を使用して、各 GUI 要素を独自のクラスに分離する必要がありますか?

多分これは良いアプローチではありませんか?

4

3 に答える 3

2

これ良いアプローチです。ただし、から継承しないでくださいOpenFileDialog。単純なクラスを作成し、そこに物を入れるだけです。

このようなもの(アイデアとして):

class FileDialogStuff
{
    static OpenFileDialog dialog = new OpenFileDialog();

    public static string GetFile()
    {
        DialogResult result = dialog.ShowDialog();
        //Do stuff
        return dialog.FileName;
    }
}
于 2012-07-26T18:57:58.317 に答える
1

明確なコメントに基づくと、ユーティリティクラスまたはファクトリクラスのいずれかが必要なようです。おそらく以下のようなものです:

public interface IFileOpener
{
    public bool PresentFileOpenDialogToUser();
    public string RequestedFilePath { get; }
}

public class DefaultFileOpener : IFileOpener
{
    private string filePath = default(string);

    public bool PresentFileOpenDialogToUser()
    {
        OpenFileDialog ofd = new OpenFileDialog();
        DialogResult dr = ofd.ShowDialog();
        if (dr == DialogResult.Cancel)
        {
            this.filePath = default(string);
            return false;
        }
        else
        {
            this.filePath = ofd.FileName;
            return true;
        }
    }

    public string RequestedFilePath
    {
        get 
        {
            return this.filePath;
        }
    }
}

public class FileOpenerFactory
{
    public static IFileOpener CreateFileOpener()
    {
        return new DefaultFileOpener();
    }
}

そしてあなたの形で:

    private void btnOpenFile_Click(object sender, EventArgs e)
    {
        IFileOpener opener = FileOpenerFactory.CreateFileOpener();
        if (opener.PresentFileOpenDialogToUser())
        {
            //do something with opener.RequestedFilePath;
        }
    }

部分的なクラスで何かを行うこともできるので、メインフォームには次のようなものがあります

    private void btnOpenFile_Click(object sender, EventArgs e)
    {
        this.OpenMyFile();
    }

そしてあなたの部分的なクラスではあなたは持っています:

public partial class Form1
{
    private void OpenMyFile()
    {
        IFileOpener opener = FileOpenerFactory.CreateFileOpener();
        if (opener.PresentFileOpenDialogToUser())
        {
            //do something with opener.RequestedFilePath;
        }
    }
}

多くの場合、インターフェイスまたはフォーカスされた機能の実装として部分クラスを使用すると非常に便利です。

于 2012-07-26T19:19:04.533 に答える
1

C# の仕様によると、シールされたクラスを別のクラスに継承することはできません。直接開始する必要があります。

OpenFileDialog がシール クラスの場合、それを継承することはできません。

于 2012-07-26T18:48:26.507 に答える