Тема 9. Интерфейсы
Простой интерфейс в C#.
interface IPerson
{
void WriteName();
void WriteAge();
void WriteFullInfo();
}
Реализация интерфейса
interface IFormula
{
int Calculate(int a, int b);
}
interface ITest
{
bool IsAllOk();
}
class FormulaSum : IFormula, ITest
{
public int Calculate(int a, int b)
{
return a + b;
}
public bool IsAllOk()
{
if (Calculate( 3, 8 ) != 11) return false;
if (Calculate( -6, 2 ) != -4) return false;
if (Calculate( -9, 24 ) != 15) return false;
return true;
}
}
class Calculator
{
public static void doCalculate( IFormula Fm, bool WithTest )
{
if ( WithTest )
{
ITest t = ( ITest ) Fm;
if ( ! t.IsAllOk() )
{
Console.WriteLine("Error !");
return;
}
}
int r = Fm.Calculate( 72, 89 );
Console.WriteLine( "Result: " + r );
}
}
Использование:
IFormula f = new FormulaSum();
Calculator.doCalculate(f, true);
Особенности:
Для интерфейсов употребляется выражение «Реализация» а не «Наследование». То есть говорят что класс реализует интерфейс, а не наследует интерфейс. Однако один интерфейс может наследовать другой интерфейс.
Класс может быть наследником только одного класса и реализовывать несколько интерфейсов.
В данной реализации класс Calculator выполняет две функции – тестирования и вычисления. Необходимо улучшить реализацию.
Реализация модульного тестирования
class Calculator2
{
public static void doCalculate( IFormula Fm )
{
int r = Fm.Calculate(72, 89);
Console.WriteLine("Result: " + r);
}
}
class Tester
{
public static bool IsOk( ITest t )
{
if (!t.IsAllOk())
{
Console.WriteLine("Error !");
return false;
}
return true;
}
}
Использование:
Совмещенное:
IFormula f = new FormulaSum();
if (Tester.IsOk((ITest)f))
{
Calculator2.doCalculate(f);
}
Тестирование:
IFormula f = new FormulaSum();
Tester.IsOk( (ITest)f );
Эксплуатация:
IFormula f = new FormulaSum();
Calculator2.doCalculate(f);
Дополнительная литература
http://metanit.com/sharp/tutorial/3.9.php http://mycsharp.ru/post/36/2013_12_25_interfejsy_v_si-sharp_mnozhestvennoe_nasledovanie.html