Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ProgBasics_lec08_interfaces

.pdf
Скачиваний:
7
Добавлен:
14.04.2015
Размер:
531.15 Кб
Скачать

Проектируем простую систему

Модель: подключение к базе данных

Характеризуется:

возможностью открыть/закрыть соединение

состоянием соединения (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) {

//какая-то реализация, возможно, другая

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]