Что неправильно в определении следующих интерфейсов:
public abstract interface IAction { void Move(); } internal interface IRunAction : IAction { void Run(); }
Варианты ответов (ответов может быть несколько):
Интерфейсы не могут иметь модификатор доступа internal
Интерфейсы не могут иметь модификатор abstract
Интерфейс IRunAction должен определить метод Move, так как базовый интерфейс IAction является абстрактным
От абстрактного интерфейса нельзя наследоваться
Интерфейсы не могут иметь модификатор abstract.
Дана следующая программа:
using System; namespace HelloApp { class Program { static void Main(string[] args) { IAction action = new RunAction(); action.Move(); Console.ReadKey(); } } class RunAction : IRunAction { internal void Move() { Console.WriteLine("I am running"); } } interface IAction { void Move(); } interface IRunAction : IAction { new void Move(); } }
Почему данная программа не скомпилируется? Варианты ответов:
Потому что метод Move в IRunAction определен с ключевым словом new
Потому что в обоих интерфейсах определен метод Move, и программа не знает, какой именно из этих методов вызывать
Потому что метод Move в классе RunAction определен с модификатором internal
Потому что класс RunAction должен определить две реализации метода Move для каждого из интерфейсов
При реализации метода интерфейса в классе данный метод может иметь только модификатор public. Определение реализации с модификатором internal некорректно.
Класс Tester реализует интерфейсы IFoo и IBar:
interface IFoo { void Execute(); } interface IBar { void Execute(); } class Tester : IFoo, IBar { public void Execute() { Console.WriteLine("Tester Executes"); } }
Метод Execute()
какого именно интерфейса реализует класс Tester?
Класс Tester реализует метод Execute сразу обоих интерфейсов.
Класс Tester реализует интерфейсы IFoo и IBar:
interface IFoo { void Execute(); } interface IBar { void Execute(); } class Tester : IFoo, IBar { void IFoo.Execute() { Console.WriteLine("IFoo Executes"); } void IBar.Execute() { Console.WriteLine("IBar Executes"); } }
Реализация метода Execute()
из какого интерфейса будет вызвана в следующем коде:
Tester t = new Tester(); t.Execute();
Выше приведенный код не будет скомпилирован. Необходимо явно указать, реализацию какого интерфейса мы хотим использовать, например, с помощью операции приведения типов:
Tester t = new Tester(); (t as IFoo).Execute();