Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中派生类的可视化#_C#_Design Patterns_User Interface_User Controls - Fatal编程技术网

C# C语言中派生类的可视化#

C# C语言中派生类的可视化#,c#,design-patterns,user-interface,user-controls,C#,Design Patterns,User Interface,User Controls,我有一个基类(代表一个充满小球的真实世界容器)和一些派生类。这很好用。 我的问题是如何进行他们的可视化。我有一个可视化基类的用户控件。对于每个派生类都有一个派生的UserControl是最好的解决方案吗?还是让一个人为所有人工作更好? 编辑: 显然我不够具体。始终有相同的基本外观:内部有许多圆的矩形。类之间的区别在于容器的填充方式。一种类型将种子放在中间,并在树状结构中创建其他球体——在这种情况下,父母和孩子之间的连接线应该被绘制出来。 一般来说,类的可视化外观应该是一致的,每个派生类型都有一些

我有一个基类(代表一个充满小球的真实世界容器)和一些派生类。这很好用。
我的问题是如何进行他们的可视化。我有一个可视化基类的用户控件。对于每个派生类都有一个派生的UserControl是最好的解决方案吗?还是让一个人为所有人工作更好?
编辑:
显然我不够具体。始终有相同的基本外观:内部有许多圆的矩形。类之间的区别在于容器的填充方式。一种类型将种子放在中间,并在树状结构中创建其他球体——在这种情况下,父母和孩子之间的连接线应该被绘制出来。
一般来说,类的可视化外观应该是一致的,每个派生类型都有一些特殊性。

我想只有你才能明确地回答这个问题。给定子类的UI很可能是您想要的,但是如果子类之间的差异很小,您会发现在较少的用户控件中添加一些条件逻辑会更容易。我认为没有一个正确的答案来回答这个问题。

仅凭模糊的描述很难说。我们真的需要知道,至少,派生类之间的区别是什么


一般来说,在知识有限的情况下,如果派生类的可视化效果彼此没有差异,我会为每个派生类使用一个派生UserControl,然后,无论如何,使用一个UserControl。这里的要点是干燥。

这在很大程度上取决于显示器的相似性。如果派生类的显示与基类非常相似,那么您只需要一个UserControl来进行可视化。OTOH,如果每个派生类都需要显示唯一的内容,那么最好使用单独的UserControl来可视化每个派生类。 如果没有关于你们课程的更具体的信息,我真的不能说得更具体

编辑:
根据您的其他信息,我想说您应该有一个绘制commom矩形容器的基本显示类,然后派生出处理绘制每种特定类型内容的用户控件。

解决此问题的一种方法是按照MVVC透视图对其进行分解:

您需要一个UserControl作为视图

一个基础画师,将“包含圆的长方体”作为ViewModel进行绘制。 衍生画家实现了对象及其相互连接的不同定位逻辑

如果对象的外观可能会有所不同,则它们本身应作为ViewModel(可能通过适配器模式)提供给画家

最后,您的圆、矩形和与它们相关的项目就是模型

一般来说:


视图(UserControl)->视图模型(画师+派生画师+对象视图模型)->模型(圆形、矩形等)

我不完全理解您的问题域,但我认为您需要进一步细分。将模型分解为多个部分,并为每个部分编写视图,然后就可以将它们连接起来

我会为你的球体写一个视图,为球体之间的线写一个视图,为包含所有内容的矩形写一个视图,然后你的每个模型将负责安排这些内容并创建相应的SphereModels和LineModels(以及你需要的任何其他内容)然后,您的主视图只需要负责在框中布局这些内容

记住,总是喜欢构图而不是继承!专注于把你的问题分解成更小的部分


祝你好运

我想我应该使用一个基本的Visualizer类,它有一些用于绘制圆和线的保护方法,也许还有一些用于绘制表面(画布?)的属性,以便每个实现都可以计算基于测量的位置,等等

基类实现所有必要的接口方法/道具,使其成为可视化工具

当可视化工具应该绘制自身时,使用IDE调用的方法中的策略模式。。。该方法实现可以清除画布、设置画笔以及每个实现所共有的其他内容,然后调用基类的抽象方法,该方法实际将圆/框/线/等放置在画布上

这样,每个具体的实现就只需要考虑逻辑,以便根据其规则集正确地定位内容-所有“画布上的绘图内容”都保存在基类中


编辑:更正了可能导致混淆的打字错误,我在“visualizer”时使用了“control”一词。

这听起来像是有多种解决方案的情况

一种方法是将UserControl设置为在基类中调用虚方法,然后在派生类中重写它。在派生类中,您可以调用基本实现来初始设置框架

还可以将其设置为在层(容器层、球体层、线层等)中渲染,并让子类渲染任何唯一的层,并确定顺序。这可能很昂贵,但如果大部分图像保持不变,它可以平滑视觉效果

另一种是使用委托而不是继承,但这往往会变得混乱。由于性能问题,这通常不是一个好主意。但是,它确实具有运行时灵活性的优势。根据代码的其他部分,您可能能够在使用此模型的中途切换增长样式。如果您不认为自己利用了这种灵活性,我建议您使用不同的模型

无论您使用什么方法,我都建议基类提供公共绘图例程以确保一致性。基类中的例程应该被大多数子类使用,但不一定被所有子类使用。这通常是一个r