.NET 4.x Динамическое наследование интерфейсов - C#
Формулировка задачи:
В книге "Паттерны программирования" нашел интересную тему на Java про динамическое наследование интерфейсов. Попобовал реализовать это на C#, к сожалению не получилось. Вот код суперкласса на Java.
Имеется соответствующий интерфейс FlyBehavior очень простой. Естественно имеется класс, производный от интерфейса.
Далее код производного класса
На Java все это прекрасно компилируется и работает.
Теперь код на C#. Класс-родитель
Понятно, что имеются интерфейсы и классы, производные от интерфейсов, они простые и похожи на те, что в Java. Вот один
А вот производный класс, в котором и возникает ошибка уже на этапе компиляции
Ошибка такая "ClassDuck.Duck.flyBechavior" недоступен из-за его уровня защиты". Вопрос вот в чем, С# в принципе не может реализовать такое наследование, или я просто где-то туплю. Скажу сразу, мне удалось реализовать это поведение, но не так изящно, как в Java, а хотелось бы получить похожее поведение
public abstract class Duck {
FlyBehavior flyBehavior;
public Duck() {}
public void performFly() {
flyBehavior.fly(); }
public abstract void display();
}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("Я дикая утка");}
} public abstract class Duck
{
IFlyBehavior flyBechavior;
public Duck() { }
public void performFly()
{ flyBechavior.fly(); }
public abstract void display();class FlyWithWings:IFlyBehavior
{
public void fly()
{ Console.WriteLine("Машем крыльями!"); }
} class MallardDuck : Duck
{
public MallardDuck()
{ flyBechavior = new FlyWithWings(); }
public override void display()
{ Console.WriteLine("Я дикая утка"); }
}Решение задачи: «.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("Я дикая утка!");
}
}
}