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

ProgBasics_lec08_interfaces

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

Множественное наследование

public class Number : IEquatable<Number>, IComparable<Number> { public int Value { get; set; }

public bool Equals(Number obj) { if (obj == null) {

return false;

}

return Value == obj.Value;

}

public int CompareTo(Number obj) { if (obj == null) {

throw new ArgumentNullException("obj");

}

if (Value == obj.Value) { return 0;

}

return Value > obj.Value ? 1 : -1;

}

}

Множественное наследование

public interface ISomeContract { void DoSmth();

}

public interface IOtherContract {

void DoSmth();

}

public class DummyClass: ISomeContract, IOtherContract

{

public void DoSmth() { … } IOtherContract.DoSmth() { … };

}

И это работает!

DummyClass obj = new DummyClass(); obj.DoSmth(); // OK, вызов ISomeContract.DoSmth() ((IOtherContract)obj).DoSmth();

Интерфейс – тип данных (?)

IEquatable<Number> number = new Number { Value = 2.0

};

IEquatable<Number> otherNumber = new Number { Value = 1.0

};

bool equals = number.Equals(otherNumber);

«Интерфейсы никогда не являются типами данных, и в них не бывает реализаций методов по умолчанию»

© Эндрю Троелсен

Использование реализаций - одинаковое

public static void WriteEquality<T>(T obj1, T obj2) where T : IEquatable<T>

{

System.Console.Write(obj1.Equals(obj2));

}

//где-то внутри метода, например, Main Set set = new Set();

WriteEquality(set);

Вернёмся к DbConnection

public interface IDbConnection

{

bool Connected { get; } void Open();

void Close();

}

ISqlConnection, IOracleConnection

public interface ISqlConnection : IDbConnection

{

void ExecuteSqlCommand(string cmd);

}

public interface IOracleConnection : IDbConnection

{

void ExecuteOracleCommand(string cmd);

}

Реализация

public class SqlConnection : ISqlConnection { public bool Connected { get; private set; } public void Open() {

Connected = true;

Console.WriteLine("Connected to SQL");

}

public void Close() { Connected = false;

Console.WriteLine("Disconnected from SQL");

}

public void ExecuteSqlCommand(string cmd) { Console.WriteLine("Executed: {0}", cmd);

}

}

Пример использования

static void Main() {

IDbConnection connection = new SqlConnection(); connection.Open(); Console.WriteLine(connection.Connected); ISqlConnection sql = connection as ISqlConnection; sql.ExecuteSqlCommand("DROP TABLE t; GO"); connection.Close();

if (connection is IOracleConnection) { Console.WriteLine("This is an Oracle!");

}

}

Обратите внимание!

Оператор as: <someObject> as <Type>

Приводит объект someObject к типа Type

Если не получилось, результат – null

Только для reference-типов

Оператор is: <obj> is <Type>

Проверка объекта obj на совместимость с типом

Type

Результат выражения – bool

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