Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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#alternative中扩展两个基类_C#_Asp.net Mvc - Fatal编程技术网

在C#alternative中扩展两个基类

在C#alternative中扩展两个基类,c#,asp.net-mvc,C#,Asp.net Mvc,我知道你不能在C#中扩展两个基类。我想做的是最终扩展默认Windows窗体类的功能,我也不能这样做,因为它不是开源的 所以我所有的表单都有5个公共函数。有大量的冗余代码。除此之外,问题还在不断恶化,因为我还有其他类必须调用这些重复函数 下面是一个基本示例 public class A : Form { B b; public A() { b = new B(this); } private void back() { b.go(); }

我知道你不能在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应用程序,所以不同的函数应该位于不同的位置,以便易于维护

这样做的结果是,维护起来非常困难。有没有什么聪明的方法我没想到

如有任何建议,欢迎提出


谢谢。

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

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,但也要应用自己的界面
i保存所有的导航函数
——或任何您想要调用的功能

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
}

这将限制您的重复,并在您现在拥有的NavigableIndowsForm基类中公开所有必要的函数。

还将向我们展示
C
的概要。对于WinForms,也可以将MVP作为替代方案。并尽可能避免使用objectobj之类的东西。谢谢你,这回答了我的问题,因为我的措辞很完美,但我想我没有发布足够的代码。如果不发布一页又一页的代码,就很难解释这个问题。事实上,我尝试过这一点,并重写了很多东西,但它总是在一段时间内到达一个点,需要做演员,但它不允许我:(谢谢你,虽然这是我所问问题的完美答案。我们不能回答没有被问到的问题。在更大的范围内也有类似的解决方案。这是非常棒的回答。这确实在我脑海中闪过,但我只是想,如果我这样做的话,VS将不会自动生成我的设计代码,因为我在拖放,但我如果我错了,我现在就试试。