在C#alternative中扩展两个基类
我知道你不能在C#中扩展两个基类。我想做的是最终扩展默认Windows窗体类的功能,我也不能这样做,因为它不是开源的 所以我所有的表单都有5个公共函数。有大量的冗余代码。除此之外,问题还在不断恶化,因为我还有其他类必须调用这些重复函数 下面是一个基本示例在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(); }
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将不会自动生成我的设计代码,因为我在拖放,但我如果我错了,我现在就试试。