.NET 4.x Динамическое наследование интерфейсов - C#

Узнай цену своей работы

Формулировка задачи:

В книге "Паттерны программирования" нашел интересную тему на Java про динамическое наследование интерфейсов. Попобовал реализовать это на C#, к сожалению не получилось. Вот код суперкласса на Java.
Листинг программы
  1. public abstract class Duck {
  2. FlyBehavior flyBehavior;
  3. public Duck() {}
  4. public void performFly() {
  5. flyBehavior.fly(); }
  6. public abstract void display();
  7. }
Имеется соответствующий интерфейс FlyBehavior очень простой. Естественно имеется класс, производный от интерфейса.
Листинг программы
  1. public class FlyWithWings implements FlyBehavior {
  2. @Override
  3. public void fly() {
  4. System.out.println("Я умею летать");}
  5. }
Далее код производного класса
Листинг программы
  1. public class MallardDuck extends Duck {
  2. public MallardDuck() {
  3. flyBehavior = new FlyWithWings(); }
  4. public void display(){
  5. System.out.println("Я дикая утка");}
  6. }
На Java все это прекрасно компилируется и работает. Теперь код на C#. Класс-родитель
Листинг программы
  1. public abstract class Duck
  2. {
  3. IFlyBehavior flyBechavior;
  4. public Duck() { }
  5. public void performFly()
  6. { flyBechavior.fly(); }
  7. public abstract void display();
Понятно, что имеются интерфейсы и классы, производные от интерфейсов, они простые и похожи на те, что в Java. Вот один
Листинг программы
  1. class FlyWithWings:IFlyBehavior
  2. {
  3. public void fly()
  4. { Console.WriteLine("Машем крыльями!"); }
  5. }
А вот производный класс, в котором и возникает ошибка уже на этапе компиляции
Листинг программы
  1. class MallardDuck : Duck
  2. {
  3. public MallardDuck()
  4. { flyBechavior = new FlyWithWings(); }
  5. public override void display()
  6. { Console.WriteLine("Я дикая утка"); }
  7. }
Ошибка такая "ClassDuck.Duck.flyBechavior" недоступен из-за его уровня защиты". Вопрос вот в чем, С# в принципе не может реализовать такое наследование, или я просто где-то туплю. Скажу сразу, мне удалось реализовать это поведение, но не так изящно, как в Java, а хотелось бы получить похожее поведение

Решение задачи: «.NET 4.x Динамическое наследование интерфейсов»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication22
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Duck md = new MallardDuck();
  13.             md.PerformFly();
  14.             md.Display();
  15.             Console.ReadLine();
  16.         }
  17.     }
  18.     public interface IFlyBehavior
  19.     {
  20.         void Fly();
  21.     }
  22.     public abstract class Duck
  23.     {
  24.         public Duck() { }
  25.         public IFlyBehavior flyBehavior;
  26.  
  27.         public void PerformFly()
  28.         {
  29.             flyBehavior.Fly();
  30.         }
  31.         public abstract void Display();
  32.     }
  33.     public class FlyWithWings : IFlyBehavior
  34.     {
  35.         public void Fly()
  36.         {
  37.             Console.WriteLine("Машем крыльями!");
  38.         }
  39.     }
  40.     public class MallardDuck : Duck
  41.     {
  42.         public MallardDuck()
  43.         {
  44.             flyBehavior = new FlyWithWings();
  45.         }
  46.         public override void Display()
  47.         {
  48.             Console.WriteLine("Я дикая утка!");
  49.         }
  50.     }
  51. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы