Я просто изучаю методы расширения C# и задавался вопросом, могу ли я использовать его для предоставления реализации по умолчанию для интерфейса.C# - использование методов расширения для обеспечения реализации интерфейса по умолчанию
Скажи:
public interface Animal {
string MakeSound();
}
public static string MakeSound(this Animal) {
return "";
}
Тогда
public class Dog : Animal {
string MakeSound() {
return "Bark";
}
}
public class Porcupine : Animal {
}
И последнее:
Animal dog = new Dog();
Animal porcupine = new Porcupine();
Print(dog.MakeSound());
Print(porcupine.MakeSound());
Я хотел бы дикобраза и любых других животных, которые явно не реализованы MakeSound
использовать по умолчанию, который возвращает пустую строку, но собаку и любое животное, которое делает es имеют явную реализацию, возвращают свою собственную реализацию, такую как «Bark».
Так что мои вопросы: 1. Является ли это выполнимым? 2. Если нет, есть ли другой способ реализовать поведение по умолчанию для интерфейса?
Абстрактный класс вместо интерфейса не является вариантом, поскольку C# не поддерживает множественное наследование, а мои классы наследуют поведение другого класса.
Нет. Метод расширения не может использоваться для удовлетворения контрактных контрактов. –
Хорошо, стоило того ... Любые другие предложения о том, как это сделать, учитывая, что я не хочу переписывать поведение по умолчанию и тот факт, что я не могу использовать абстрактный класс? – tbkn23
Почему вам не нужен абстрактный класс? Аннотация - это просто интерфейс с некоторыми из уже реализованных методов. Затем вы просто переопределяете методы для тех подклассов, которые должны использовать другую реализацию для базового класса. – Trent