一个班级应如何从另一个班级请求信息?

时间:2009-02-13 13:49:10

标签: vb.net design-patterns

我正在研究用于CAD绘图的VB.NET批量PDF导出程序。程序运行良好,但架构很乱。基本上,一个大功能从头到尾完成整个过程。我想做一个单独的课程,或几个,来做出口工作。

问题在于:
有时我的程序创建的pdf文件已经存在。在这种情况下,我想询问用户他/她是否要覆盖现有的PDF。如果实际上有一些东西会被覆盖而我只想这样做一次,我只想这样做。换句话说,“是”=“对所有人都是”。表单(将调用这个新的PDF导出类)确定将调用哪些PDF文件以及是否会有任何覆盖,这似乎是错误的。事实上,最好在处理单个CAD图纸时确定PDF文件的名称(因为我可能希望使用仅在后台加载CAD程序中的文件后才可用的信息)。

以下是问题:
我该如何处理提示用户的过程?我想保留我的PDF导出类中的所有GUI逻辑(甚至像对话框一样简单)。我需要一种方法让PDF导出类说“嘿,我需要知道我是否应该覆盖或跳过这个文件”,并且表单类(或任何其他类)说,“嗯,好吧,我会询问用户并回复你。“

似乎应该有一些模式来处理这种情况。它是什么?

随访:

事件:看起来这是一个很好的方法。这是关于代码在PDF导出类中应该是什么样的吗?

    Dim e As New FileExistsEventArgs(PDFFile)
    RaiseEvent FileExists(Me, e)
    If e.Overwrite Then
        'Do stuff here
    End If

一个疯狂的想法:如何将委托函数传递给PDF导出类的导出方法来处理覆盖情况呢?

5 个答案:

答案 0 :(得分:4)

您可以使用Event,创建一个自定义事件参数类,其中包含应用程序可以调用的属性。然后当您的应用处理事件时提示用户,然后告诉导出器该做什么。我是一个c#家伙,所以我先在那里给你一个样本:

void form_Load(object sender,EventArgs e)
{
   //We are subscribing to the event here. In VB this is done differently
   pdfExporter.FileExists+=new FileExistsEventHandler(pdfExporter_fileExists)
}

void pdfExporter_fileExists(object sender, FileExistsEventArgs e)
{
   //prompUser takes the file and asks the user
   if (promptUser(e.FileName)) 
   {
   }
}

答案 1 :(得分:1)

您的PDF制作课程应该提出event。这个事件应该有一个eventargs对象,它可以有一个名为“Overwrite”的布尔属性,GUI以你想要的任何方式设置它。当事件在PDF类中返回时,您将拥有用户的决定,并且可以根据需要覆盖或不覆盖。 Gui无论如何都可以处理这个事件。

另外,我赞扬你努力保持两个分开!

答案 2 :(得分:0)

因此,类上适当的方法需要

的可选参数
[OverwriteExisting as Boolean = False]

但是,您的表单需要处理确定文件是否存在的逻辑。在我看来,这不是一个你想要封装在PDF导出类中的函数。假设您的表单或其他函数/类确定需要覆盖,则调用导出方法将True作为布尔值传递给导出类。

答案 3 :(得分:0)

您可以执行两阶段提交类型的操作。

该类有两个接口,一个用于准备文件名和文件系统,另一个用于实际工作。

因此,第一阶段,GUI调用初始化界面,并快速回答是否有任何需要重写的问题。可能甚至是一个将被覆盖的文件的综合列表。用户回答,其他响应中的布尔变量是已知的,然后导出器进入实际工作,用户可以去做其他事情。

会有一些重复的计算,但是让用户尽快完成一部分操作可能是值得的。

答案 4 :(得分:0)

您无法将GUI内容保留在PDF导出代码之外。但是你可以精确地定义所需的最小值,而不是绑定到你正在使用的任何框架。

我是如何做到的,我有一个Status类和一个Progress类。这两个存在是因为Status设计用于更新状态消息,而Progress Bar旨在用于处理进度指示。

它们都使用类型为IStatusDisplay和IPrograssDisplay的对象。

我的GUI定义了一个实现IStatusDisplay(或IProgressDisplay)的对象,并注册为具有状态和进度的DLL的当前显示。具有状态和进度的DLL也有两个名为NullStatus和NullProgress的单例,可以在没有想要的UI反馈时使用。

通过这个方案,我可以使用我想要的更多状态或进度更新来加密我的代码,我只担心GUI层的实现。如果我想要一个静默过程,我可以使用Null对象。此外,如果我完全更改我的GUI框架,则所有新GUI必须做的是创建实现IStatusDisplay的新对象,IProgressDisplay。

另一种方法是引发事件,但我发现在GUI级别处理会让人感到困惑和复杂。特别是如果你有多个屏幕,用户可以切换。通过使用接口,您可以使连接更清晰,更易于维护。

修改 您可以创建一个Prompt Class和一个IPromptDisplay来处理诸如询问您是否要覆盖文件等情况。

例如

Dim P as New Prompt(MyPromptDisplay,PromptEnum.YesNo)
'MyPromptDisplay is of IPromptDisplay and was registered by the GUI when the application was initialized

If PromptYesNo.Ask("Do you wish to overwrite files")= PromptReply.Yes Then
    'Do stuff here
End If