Рассмотрим следующий пример:
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
могут не быть изменены, как мне решить эту двусмысленность самым чистым, наиболее предпочтительным способом?
Обновление
Основываясь на ответах, которые я получил за использование явной реализации интерфейса, я хочу упомянуть, что, хотя это действительно решает проблему, оно не решает ее идеальным способом для меня, потому что я использую свой объект AllYourBase
как IAllYourBase
большую частьвремя, никогда как IBase1
или IBase2
.В основном это связано с тем, что IAllYourBase
также имеет методы интерфейса (я не смог подробно описать их в моем фрагменте кода выше, потому что я думал, что они не имеют отношения к делу), которые реализованы AllYourBase
, и я тоже хочу получить к ним доступ.Постоянное приведение вперед и назад будет очень утомительным и приведет к грязному коду.
Я попробовал одно решение, включающее определение свойства Percentage
в IAllYourBase
и не использующее явную реализацию интерфейса, которая, казалось,избавиться от ошибки компилятора хотя бы:
class IAllYourBase : IBase1, IBase2
{
int Percentage { get; set; }
}
Это правильное решение?