Связанное сообщение: Неоднозначность метода интерфейса C#
Код из того же источника:
private interface IBase1
{
int Percentage { get; set; }
}
private interface IBase2
{
int Percentage { get; set; }
}
private interface IAllYourBase : IBase1, IBase2
{
}
private class AllYourBase : IAllYourBase
{
private int _percentage;
public int Percentage
{
get { return _percentage; }
set { _percentage = value; }
}
}
private void Foo()
{
IAllYourBase iayb = new AllYourBase();
int percentage = iayb.Percentage; // Fails to compile. Ambiguity between 'Percentage' property.
}
(Но не отвечает на мой вопрос — «ПОЧЕМУ контракты становятся неоднозначными ? " )
Дано:
Интерфейс — это контракт, который ДОЛЖЕН соблюдать реализующий класс.
Если два (или более) интерфейса запрашивают один и тот же контракт, и интерфейс передает их «вперед», а затем класс реализует их оба и ПРИНИМАЕТ, что общие контракты должны служить только одним контрактом для реализующих классов (не предоставляя явная реализация). Затем,
Почему компилятор показывает предупреждение о «двусмысленности» для обычных контрактов?
Почему компилятору не удается выполнить компиляцию при попытке доступа к неоднозначному контракту через интерфейс (iayb.Percentage)?
Я хотел бы знать, какую выгоду дает компилятору это ограничение?
Изменить: Предоставление реального варианта использования, когда я хотел бы использовать контракты между интерфейсами как один контракт.
public interface IIndexPriceTable{
int TradeId{get;}
int IndexId{get;}
double Price{get;}
}
public interface ILegPositionTable{
int TradeId {get;}
int LegId {get;}
int Position {get;}
}
public interface ITradeTable {
int TradeId{get;}
int IndexId{get;}
int LegId{get;}
//others
}
public interface IJoinedTableRecord : IIndexPriceTable, ILegPositionTable, ITradeTable {
//Just to put all contracts under one interface and use it as one concrete record, having all information across different tables.
}