在C#替代中扩展两个基类

时间:2014-05-16 17:55:26

标签: c# asp.net-mvc

我知道你不能在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应用程序,因此假设不同的函数位于不同的位置以便于维护。

由于这样做,它使维护非常困难。有没有一些聪明的方法,我还没有?

任何建议表示赞赏,

感谢。

2 个答案:

答案 0 :(得分:3)

对于此特定问题,请使用界面:

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();
}

答案 1 :(得分:0)

您需要扩展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的基类中公开所有必要的函数。