Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
5 / 5 / 4
Регистрация: 28.04.2014
Сообщений: 37
1
.NET 4.x

Динамическое наследование интерфейсов

28.04.2014, 10:15. Показов 2619. Ответов 8
Метки нет (Все метки)

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

Наследование и реализация интерфейсов
Есть всем известный класс List<T>. Он должен реализовать интерфейс IList<T>, который в свою очередь...

Возможно ли наследование интерфейсов?
Ребят, вопрос тут такой...споры да споры...Возможно ли наследование интерфейсов в C#? Если да, то...

BindingFlags и наследование интерфейсов
Добрый день! В общем BindingFlags. Получаю список свойств: PropertyInfo p =...

Наследование интерфейсов структурами
Возникла необходимость наследования пары методов в структурах, всё вроде компилируется. public...

8
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
28.04.2014, 10:21 2
C#
1
2
3
public abstract class Duck
    {
        protected IFlyBehavior flyBechavior;
В C# дефолтный модификатор - private, в отличие от package-private в java.
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.04.2014, 10:26 3
Помимо вышеуказанного protected можно также использовать уровень доступа internal (только текущее assembly) или protected internal (и наследники и assembly).
0
5 / 5 / 4
Регистрация: 28.04.2014
Сообщений: 37
28.04.2014, 10:26  [ТС] 4
Это я и сам попробовал сделать, но на этапе компиляции получил такую ошибку "Несовместимость по доступности: доступность типа поля "ClassDuck.IFlyBehavior" ниже доступности поля "ClassDuck.Duck.flyBechavior"
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
28.04.2014, 10:34 5
А интерфейс IFlyBehavior у вас имеет какие-либо модификаторы? Если нет то пометьте его public.

Добавлено через 1 минуту
Либо же снимите public-модификатор с класса Duck.
0
5 / 5 / 4
Регистрация: 28.04.2014
Сообщений: 37
28.04.2014, 10:45  [ТС] 6
Теперь возникает ошибка на этапе выполнения. При вызове метода performFly() ошибка "Необработанное исключение: Ссылка на объект не указывает на экземпляр объекта."

И в принципе, я могу понять это сообщение. Ведь в классе Duck объекта не создается, только объектная переменная, видимо это C# и не нравиться
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
28.04.2014, 10:50 7
Лучший ответ Сообщение было отмечено S_Schmal как решение

Решение

Просмотрите свой код и найдите 5 отличий
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
 
 
class Program
{
    static void Main(string[] args)
    {
        Duck d = new MallardDuck();
        d.display();
        d.performFly();
    }
}
 
interface IFlyBehavior
{
    void fly();
}
 
class FlyWithWings : IFlyBehavior
{
    public void fly()
    { Console.WriteLine("Машем крыльями!"); }
}
 
abstract class Duck
{
    protected IFlyBehavior flyBechavior;
 
    public Duck() { }
 
    public void performFly()
    { flyBechavior.fly(); }
 
    public abstract void display();
}
 
 
class MallardDuck : Duck
{
    public MallardDuck()
    { flyBechavior = new FlyWithWings(); }
 
    public override void display()
    { Console.WriteLine("Я дикая утка"); }
}
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
28.04.2014, 10:58 8
Лучший ответ Сообщение было отмечено S_Schmal как решение

Решение

Kruds, Аналогично.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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("Я дикая утка!");
        }
    }
}
1
5 / 5 / 4
Регистрация: 28.04.2014
Сообщений: 37
28.04.2014, 12:03  [ТС] 9
Спасибо, ребята! Работают оба варианта. Честноо говоря, так и не понял, что у меня было не так, т.к. на первый взгляд у меня и у вас код одинаков. Причем даже у интерфейса IFlyBehavior модификатор public не понадобился.
0
28.04.2014, 12:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2014, 12:03
Помогаю со студенческими работами здесь

Диаграмма классов - наследование интерфейсов
Привет ! Если интерфейс наследует другой интерфейс, то какую стрелку нужно рисовать в UML ?? ...

Реализация, наследование классов и интерфейсов
Помогите кто чем может) Разработать методы и свойства для каждого из определяемых классов....

Организовать множественное наследование с использованием интерфейсов
Ребят, не знаю как решить. Может кто сможет? Задание выглядит так: Доработайте программу,...

Интерфейсное наследование: Что, если в цепочке иерархии интерфейсов в каждом из них есть одноименный метод
У меня вопрос, что если в цепочке иерархии интерфейсов в каждом из них есть одноименный метод. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru