在c#中扩展两个基类

本文关键字:两个 基类 扩展 | 更新日期: 2023-09-27 18:03:48

我知道你不能在c#中扩展两个基类。我想做的是最终扩展默认Windows窗体类的功能,我也不能这样做,因为它不是开源的。

所以我所有的表单都有5个共同的功能。有大量的冗余代码。最重要的是,这个问题正在向外螺旋,因为我有其他类必须调用这些重复的函数。

一个基本的例子如下:

public class A : Form {
   B b;
   public A() {
      b = new B(this);
   }
   private void back() {
      b.go();
   }
}
public class B {
   public void go(Object obj)
   {
      //if obj is of type A
      //call (A) obj.back();
      //if obj is of type C
      //call (C) obj.back();
      //etc...
   }

我像这样在类之间传递的原因是因为它是一个MVC应用程序,所以不同的函数应该在不同的地方,以便于维护。

这样做的结果是,它使得它非常非常难以维护。有没有什么我没想到的聪明方法?

感谢任何建议,

谢谢。

在c#中扩展两个基类

对于这个特定的问题,使用一个接口:

interface IGoBackAndForth { void back(); }
public class A : Form, IGoBackAndForth { }
public class C : ..., IGoBackAndForth { }
public void go(Object obj)
{
   var baf = object as IGoBackAndForth;
   if (baf != null) baf.back();
}

您不仅需要扩展System.Windows.Forms.Form,还需要应用您自己的接口IHaveAllThoseNavigationFunctions——或者您想叫它什么就叫什么。

public interface ISupportAllThoseNavigationFunctions
{
    NavigableWindowsForm PreviousLocation { get; set; }
    void go(NavigableWindowsForm destination);
    void back();
}
public partial class NavigableWindowsForm : Form, ISupportAllThoseNavigationFunctions
{
    private NavigableWindowsForm PreviousLocation { get; set; }
    go(NavigableWindowsForm destination)
    {
       //...
    }
    back()
    {
       go(PreviousLocation);
    }
}
public class FormA : NavigableWindowsForm
{
    // todo: implement form A specifics
}
public class FormB : NavigableWindowsForm
{ 
    // todo: implement form B specifics
}

这将限制你的重复和暴露所有必要的函数在你现在拥有的NavigableWindowsForm的基类