Вы думаете об интерфейсе неправильно.Интерфейс не является реализацией, это абстракция.
Говоря компилятору, что Sample является как IA, так и IB, вы просто сказали, что он может быть приведен к любому из этих типов и обладает всей функциональностью.требуется делать то, что ожидает вызывающий код.
т.е.в следующем коде
Sample sample = new Sample();
sample.Test();
IA a = sample;
a.Test();
IB b = sample;
b.Test();
Он не вызывает три отдельных метода с именем Test, он вызывает метод Test из Sample каждый раз.Это в отличие от
object obj = sample;
obj.Test();
, который не сможет скомпилироваться, даже если у obj есть метод Test по своей природе типа Sample.
Это особенно полезно, когда вы смотрите на передачуобъект в качестве аргумента другого метода.
public void DoTest(IA a)
{
a.Test();
}
Sample sample = new Sample();
DoTest(sample);
В этом случае компилятор знает только, что что-либо с контрактом IA имеет метод Test.Неважно, что это за тип, это дело вызывающего кода.