logo search
CSharp_Prog_Guide

Явная реализация членов интерфейса с наследованием

Явная реализация интерфейса позволяет программисту реализовать два интерфейса, имеющие одинаковые имена членов, и осуществить отдельную реализацию для каждого члена интерфейса. В данном примере отображаются размеры окна как в метрических, так и в британских единицах измерения. Класс "Box" реализует два интерфейса: IEnglishDimensions и IMetricDimensions, которые соответствуют различным системам измерения. Оба интерфейса имеют одинаковые имена членов: "Length" и "Width".

Пример

------

// Explicitly implement the members of IEnglishDimensions:

float IEnglishDimensions.Length()

{

return lengthInches;

}

float IEnglishDimensions.Width()

{

return widthInches;

}

// Explicitly implement the members of IMetricDimensions:

float IMetricDimensions.Length()

{

return lengthInches * 2.54f;

}

float IMetricDimensions.Width()

{

return widthInches * 2.54f;

}

static void Main()

{

// Declare a class instance box1:

Box box1 = new Box(30.0f, 20.0f);

// Declare an instance of the English units interface:

IEnglishDimensions eDimensions = (IEnglishDimensions)box1;

// Declare an instance of the metric units interface:

IMetricDimensions mDimensions = (IMetricDimensions)box1;

// Print dimensions in English units:

System.Console.WriteLine("Length(in): {0}", eDimensions.Length());

System.Console.WriteLine("Width (in): {0}", eDimensions.Width());

// Print dimensions in metric units:

System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());

System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());

}

}

Length(in): 30

Width (in): 20

Length(cm): 76.2

Width (cm): 50.8

----

Robust Programming

If you want to make the default measurements in English units, implement the methods Length and Width normally, and explicitly implement the Length and Width methods from the IMetricDimensions interface:

// Normal implementation:

public float Length()

{

return lengthInches;

}

public float Width()

{

return widthInches;

}

// Explicit implementation:

float IMetricDimensions.Length()

{

return lengthInches * 2.54f;

}

float IMetricDimensions.Width()

{

return widthInches * 2.54f;

}

In this case, you can access the English units from the class instance and access the metric units from the interface instance:

public static void Test()

{

Box box1 = new Box(30.0f, 20.0f);

IMetricDimensions mDimensions = (IMetricDimensions)box1;

System.Console.WriteLine("Length(in): {0}", box1.Length());

System.Console.WriteLine("Width (in): {0}", box1.Width());

System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());

System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());

}