
ProgBasics_lec08_interfaces
.pdf
Множественное наследование
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