仅供参考:我制作了有用的 WinForms 和控制台 (C#) 以及 PowerShell 应用程序,但我对 OO 设计很弱。我的专业编程生涯完全是过程式编程。通过 OJT(在 S.O. 的大力帮助下),我学习了 OOP、.NET、WinForms、C# 和 Word 互操作的基础知识。正如他们所说,“我知道的足够危险”。
我已经达到了“边编码边设计”的地步,但我陷入了困境。
背景和问题
我正在编写一个 Word VSTO 插件。我正在使用自定义任务窗格 (CTP) 实现其 UI。您可能知道,对于每个 CTP,您必须至少定义一个用户控制 (UC) 对象。为了便于讨论,我的加载项将包含 5 个用户控制对象
这就是我被困住的地方:
我正在实现类 T,我意识到像类 P 一样,当用户显示表单 T 时,他们还需要显示表单 F1 或 F2 或 F3 并与之交互。无论使用表单 P 还是表单 T,表单 F1、F2 和 F3 上的控件背后的业务逻辑都是相同的。
我下意识地想从 P 和 T 中派生出 F1、F2 和 F3,但 C# 不支持多重继承
我已经阅读了足够多的内容,知道(但没有完全理解)界面可能会解决我的问题,但总的来说,它似乎有点笨拙。
我已经研究了面向对象的设计模式,抽象工厂模式看起来很有希望,但在我自己编写代码之前,我正在寻找第二种意见,因为:…使用这种模式…可能会导致最初编写代码时不必要的复杂性和额外工作。此外,更高级别的分离和抽象可能会导致系统更难以调试和维护。
在此场景中您会使用什么模式或实现方法?
这里有一个额外问题:迫使程序员实现 C# 接口的场景(条件、动机?)是什么?
无论使用 P 表单还是 T 表单,F1、F2、F3 表单控件背后的业务逻辑都是相同的
我相信您可以将业务逻辑解耦到一个单独的类,并将其注入到您的表单中,例如F1
、
F2
和
F3
。 业务逻辑解耦后,就可以在Winforms中使用MVP模式。 您可以通过创建抽象及其实现来解耦和提取业务逻辑。
这是业务逻辑的抽象。简而言之,这是一种
依赖倒置原则:
public interface IMySharedBusinessLogic
{
void SharedBusinessBehavour_1();
void SharedBusinessBehavour_2();
void SharedBusinessBehavour_3();
}
这就是抽象的具体实现:
public class MySharedBusinessLogic : IMySharedBusinessLogic
{
public void SharedBusinessBehavour_1()
{
throw new NotImplementedException();
}
public void SharedBusinessBehavour_2()
{
throw new NotImplementedException();
}
public void SharedBusinessBehavour_3()
{
throw new NotImplementedException();
}
}
然后像这样注入你的依赖项:
//using Microsoft.Extensions.DependencyInjection;
public partial class Form1 : Form
{
private readonly IMySharedBusinessLogic mySharedBusinessLogic;
public Form1(IMySharedBusinessLogic mySharedBusinessLogic)
{
InitializeComponent();
this.mySharedBusinessLogic = mySharedBusinessLogic;
MessageBox.Show(
mySharedBusinessLogic.SharedBusinessBehavour_1());
}
}