Рассмотрим следующий пример:
interface IBase1
{
int Percentage { get; set; }
}
interface IBase2
{
int Percentage { get; set; }
}
interface IAllYourBase : IBase1, IBase2
{
}
class AllYourBase : IAllYourBase
{
int percentage;
int Percentage {
get { return percentage; }
set { percentage = value; }
}
}
void Foo()
{
IAllYourBase iayb = new AllYourBase();
int percentage = iayb.Percentage; // Fails to compile. Ambiguity between 'Percentage' property.
}
В приведенном выше примере существует двусмысленность, между которой свойство Percentage
вызывает вызов. Предполагая, что интерфейсы IBase1
и IBase2
не могут быть изменены, как я могу решить эту двусмысленность самым чистым, наиболее предпочтительным способом?
Update
Основываясь на ответах, которые я получал для использования явной реализации интерфейса, я хочу упомянуть, что, хотя это и решает проблему, он не идеально подходит для меня, потому что я использую свой объект AllYourBase
как IAllYourBase
большую часть времени, а не как IBase1
или IBase2
. Это связано главным образом с тем, что IAllYourBase
также имеет методы интерфейса (я не смог подробно описать их в своем фрагменте кода выше, потому что я думал, что они неактуальны), которые реализованы с помощью AllYourBase
, и я тоже хочу получить к ним доступ. Кастинг взад и вперед все время будет очень утомительным и приведет к запутанному коду.
Я попробовал одно решение, которое включало определение свойства Percentage
в IAllYourBase
и не используя явную реализацию интерфейса, которая, по-видимому, избавлялась от ошибки компилятора:
class IAllYourBase : IBase1, IBase2
{
int Percentage { get; set; }
}
Является ли это допустимым решением?