Пример использования интерфейса для определения контракта , который связывает один класс (здесь форму) с другим.
Поскольку у вас есть несколько классов (форм), которым нужно использовать другой класс (форму Search
) для выполнения одной и той же задачи с использованием общих свойств методов, класс worker (Search
Form) не нужно знать, какой класс его создал, просто нужно полагаться на реализацию интерфейса и использовать общие свойства и методы для чтения значений, которые ему нужны, и записи результатов.
Создайте интерфейс, который определяет свойства и методы, которые создают контракт (то, что все участвующие классы должны знать и полагаться):
internal interface ISearch
{
string Query { get; }
int Other { get; }
bool ReturnValue { get; set; }
string GetSomeOtherValue();
}
Все формы, которые хотят вызвать форму Search
, должны реализовывать интерфейс ISearch
:
public class FrmMasterItem : Form, ISearch
{
public FrmMasterItem() => InitializeComponent();
// Interface implementation
public string Query { get; private set; }
public int Other { get ; private set; }
public bool ReturnValue { get; set; }
public string GetSomeOtherValue()
{
return "SomeValue";
}
private void button1_Click(object sender, EventArgs e)
{
this.Query = "SELECT someField FROM someTable";
this.Other = 100;
var search = new SearchForm();
search.ShowDialog(this);
if (this.ReturnValue)
Console.WriteLine("All Good");
}
}
Здесь при событии Button.Click
устанавливаются свойства, определенные интерфейсом, форма Search
инициализируется и отображается, устанавливая Search
текущий ток формы Владелец :
var search = new SearchForm();
search.ShowDialog(this);
Когда форма Search
закрыта, для определения результата поиска читается значение, установленное формой Search
(здесь значение ReturnValue
propeprty).
Конечно, вы можете вернуть что-либо еще или установить более одного свойства: например, вы можете вернуть DataTable.
Форма поиска определяет текущую форму вызывающего абонента с использованием интерфейса:
ISearch myOwner = null;
Затем проверяет, реализует ли данный владелец этот интерфейс: он должен знать, может ли он полагаться на свойства и методы, определенные в контракте .
Type type = this.Owner.GetType();
if (typeof(ISearch).IsAssignableFrom(type)) {
// (...)
myOwner = (ISearch)this.Owner;
}
Если текущий владелец не реализует доверенный интерфейс, возникает исключение: форма Search
не может прочитать и записать необходимые значения.
Если это так, инициализируется сам, считывая значения из известных свойств (конечно, необходимы некоторые обычные проверки, то есть null
или связанные с типом).
При закрытии он устанавливает результат, используя определенное свойство (ReturnValue
, здесь):
myOwner.ReturnValue = true;
base.OnFormClosing(e);
Форма Search
:
public partial class SearchForm : Form
{
ISearch myOwner = null;
string currentQuery = string.Empty;
string otherValues = string.Empty;
public SearchForm() => InitializeComponent();
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Type type = this.Owner.GetType();
if (typeof(ISearch).IsAssignableFrom(type))
{
myOwner = (ISearch)this.Owner;
this.currentQuery = myOwner.Query;
this.otherValues = myOwner.GetSomeOtherValue();
Console.WriteLine(this.currentQuery);
Console.WriteLine(myOwner.Other);
Console.WriteLine(this.otherValues);
}
else
{
throw new NotSupportedException("My Owner is the not the right type!");
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
myOwner.ReturnValue = true;
base.OnFormClosing(e);
}
}