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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            Duck md = new MallardDuck();
            md.PerformFly();
            md.Display();
            Console.ReadLine();
        }
    }
    public interface IFlyBehavior
    {
        void Fly();
    }
    public abstract class Duck
    {
        public Duck() { }
        public IFlyBehavior flyBehavior;
 
        public void PerformFly()
        {
            flyBehavior.Fly();
        }
        public abstract void Display();
    }
    public class FlyWithWings : IFlyBehavior
    {
        public void Fly()
        {
            Console.WriteLine("Машем крыльями!");
        }
    }
    public class MallardDuck : Duck
    {
        public MallardDuck()
        {
            flyBehavior = new FlyWithWings();
        }
        public override void Display()
        {
            Console.WriteLine("Я дикая утка!");
        }
    }
}

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


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

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

5   голосов , оценка 3.4 из 5
Похожие ответы