Я понимаю, что вы не можете распространять два базовых класса в С#. То, что я хочу сделать, в конечном счете расширяет функциональность стандартного класса Windows Form, который я не могу сделать, потому что он не является открытым исходным кодом.
Таким образом, все мои формы имеют 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, но также примените свой собственный интерфейс IHaveAllThoseNavigationFunctions
--or, как вы хотите его назвать.
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, который у вас теперь есть.