c# - 类型转换是代码设计不当的标志吗?

标签 c# user-interface casting

我会是第一个告诉别人我的代码设计需要改进的人。我忍不住觉得,当我的代码中有类型转换时,这表明需要重新设计某些内容以删除类型转换。这个问题有两个部分,第一个只是发布的那个:类型转换是代码设计不当的标志吗?

第二个问题是在第一个问题的基础上,如果类型转换真如我所想的那样邪恶,那么如何避免下面的情况呢?

class InputPanel : Control
{
  public event EventHandler InputEvent;
}

class OutputPanel : Control
{
}

class MainWindow : Form
{
  public MainWindow()
  {
    var loadButton = new Button();
    loadButton.Click += new EventHandler(HandleButtonClick);

    var inputPanel = new InputPanel();
    inputPanel.InputEvent += new EventHandler(HandleInputEvent);
    bodyControl = inputPanel;
  }

  private void HandleButtonClick(object sender, EventArgs args)
  {
    OpenFileDialog dialog = new OpenFileDialog();
    if (dialog.ShowDialog(this) == DialogResult.OK)
    {
      var data = LoadDataFromFile(dialog.FileName);
      var inputPanel = bodyControl as InputPanel; // Ugly typecast...
      if (inputPanel != null)
      {
        inputPanel.PopulateFromData(data);
      }
    }
  }

  private void HandleInputEvent(object sender, EventArgs args) 
  {
    var outputPanel = new OutputPanel();
    bodyControl = outputPanel;
  }

  Control BodyControl;
}

上述代码背后的原因是 MainWindow 窗体包含一个 MenuStrip(在此示例中简化为一个按钮)和一个控件(BodyControl)。由于需要将显示的控件从输入面板更改为输出面板,通过单击按钮,您可以简单地重新分配 BodyControl 字段(调整父项等)。这意味着一次只加载一个面板,布局逻辑变得简化,因为在 MainWindow 中只有一个面板(如果包含 MenuStrip,则为两个),而不是根据哪个状态有条件地布置多个“主体”控件程序在(输入与输出)中。

最佳答案

使用 interface 可以使代码更简洁(并避免类型转换)或 common base class对于两个控件(inputPaneloutputPanel)。只需将 BodyControl 存储为基类或接口(interface)(而不是 Control)。假设接口(interface)或基类实现了 PopulateFromData 方法,您根本不需要强制转换。

还要确保您知道 where clause在 C# 中。在处理类似场景时可以派上用场。

关于c# - 类型转换是代码设计不当的标志吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4465208/

相关文章:

c# - 将 null 分配给可为空的 int 时出错 - "The value ' null' 对属性无效”

c# - 从 ViewModel 更新 UI 线程

将 float* 转换为 char*、int* 和 char* 未产生预期结果

c++ - 如何为typedef定义隐式转换?

c# - 使用 C# 将文本粘贴到事件的 Word 窗口

c# - ContinueWith 方法返回的任务不需要 Wait() 方法?

linux - 从后台工作线程修改 Qt GUI

macos - 什么被认为是主线程重载?

c++ - 数据包转换为具有多个动态数组的结构

C# 在控制台应用程序中嵌入测试代码