ProgBasics_lec08_interfaces
.pdf
Проектируем простую систему
Модель: подключение к базе данных
Характеризуется:
•возможностью открыть/закрыть соединение
•состоянием соединения (connected,
disconnected, closed, ...)
Disconnected Oracle
DB
Program
Connected
MySQL
DB
Мы ничего не знаем про интерфейсы
public class DbConnection
{
public bool Connected { get; } public void Open()
{
//как-то открываем соединение throw new NotImplementedException();
}
public void Close() { … }
}
Помним про абстрактные классы
public abstract class DbConnection
{
public abstract void Open(); public abstract void Close();
public abstract bool Connected { get; }
}
Реализуем DbConnection
public sealed class SqlConnection : DbConnection
{
private bool connected = false; public override bool Connected
{
get { return this.connected; }
}
public void ExecuteSqlCommand(string cmd) {…} public override void Open() { … }
public override void Close() { … }
}
Необходимо дополнить функционал
Добавим новый элемент в класс DbConnection
public abstract class DbConnection
{
public abstract void Open(); public abstract void Close() { … }
public abstract bool Connected { get; }
public abstract DbConnection Clone();
}
Разделение ответственности
public abstract class Clonable<T>
{
public abstract T Clone() { ... }
}
public abstract class NotifyPropertyChanged
{
public abstract event Action PropertyChanged;
}
public abstract class DbConnection : Clonable<DbConnection>, NotifyPropertyChanged
Множественное наследование
•В C# - невозможно для классов.
•Порождает ряд сложностей
–Семантическая неопределённость
•«Проблема ромба»
A
B |
|
|
|
C |
|
|
|
|
|
|
|
D
Интерфейс – «чистый» абстрактный
класс
interface IDemoInterface
{
event Action SomethingHappened; string this[int index] { get; set; } bool AllRight { get; }
void DoSomething();
}
[атрибуты][модификаторы] interface
<Имя> [: базовые интерфейсы] { … }
Интерфейс определяет поведение
Интерфейс – это контракт
Подписка |
Реализация |
Тип, реализующий интерфейс
Интерфейс – пример полиморфизма
public class Number : IEquatable<Number> { public bool Equals(Number number) {
//какая-то реализация
}
}
public class Set : IEquatable<Set> { public bool Equals(Set set) {
//какая-то реализация, возможно, другая
}
}
