Неоднозначность метода интерфейса C#C#

Место общения программистов C#
Ответить
Anonymous
 Неоднозначность метода интерфейса C#

Сообщение Anonymous »

Рассмотрим следующий пример:

Код: Выделить всё

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< /code> и не использовать явную реализацию интерфейса, что, по-видимому, избавило по крайней мере от ошибки компилятора:

Код: Выделить всё

class IAllYourBase : IBase1, IBase2
{
int Percentage { get; set; }
}
Это правильное решение?

Подробнее здесь: https://stackoverflow.com/questions/708 ... -ambiguity
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»