继承自表单/控件并编写模块化代码

时间:2012-07-26 18:45:16

标签: c# winforms refactoring

我编写了几个简单的GUI应用程序,但所有逻辑基本上都是在我给出的默认Form1类中编写的。

所以我想也许我会将GUI逻辑重写到他们自己的类中。例如,FileOpenDialog的类,ListView的另一个类,依此类推。这样我的Form1类没有太多不必要的方法,只是处理一些基本的东西,在其他GUI方法移动后可能不是很多。

写这样的东西作为第一次尝试去某个地方

namespace WindowsFormsApplication1
{
    class OpenFileDialog1 : OpenFileDialog
    {
    }
}

然后VS告诉我,我无法从密封型中获得。

我没有尝试过其他类,但我可能会遇到同样的问题。我没有正确地继承它吗?或者我是否必须使用某种变通方法将每个GUI元素分成它们自己的类?

也许这不是一个好方法?

3 个答案:

答案 0 :(得分:2)

一个好方法。但是不要继承OpenFileDialog。只需创建一个简单的类并将其放在那里。

像这样的东西(就像一个想法):

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

    public static string GetFile()
    {
        DialogResult result = dialog.ShowDialog();
        //Do stuff
        return dialog.FileName;
    }
}

答案 1 :(得分:1)

根据c#规范,密封类不能继承到另一个类。你必须直接发起。

如果OpenFileDialog是密封类,则不能继承它。

答案 2 :(得分: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;
        }
    }
}

很多时候,将部分类用作接口或集中功能的实现非常有用。