我编写了几个简单的GUI应用程序,但所有逻辑基本上都是在我给出的默认Form1类中编写的。
所以我想也许我会将GUI逻辑重写到他们自己的类中。例如,FileOpenDialog的类,ListView的另一个类,依此类推。这样我的Form1类没有太多不必要的方法,只是处理一些基本的东西,在其他GUI方法移动后可能不是很多。
写这样的东西作为第一次尝试去某个地方
namespace WindowsFormsApplication1
{
class OpenFileDialog1 : OpenFileDialog
{
}
}
然后VS告诉我,我无法从密封型中获得。
我没有尝试过其他类,但我可能会遇到同样的问题。我没有正确地继承它吗?或者我是否必须使用某种变通方法将每个GUI元素分成它们自己的类?
也许这不是一个好方法?
答案 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;
}
}
}
很多时候,将部分类用作接口或集中功能的实现非常有用。