Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не удается преобразовать / 25 сообщений из 26, страница 1 из 2
10.02.2020, 19:29
    #39924900
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Здравствуйте!

Есть следующая логика. Есть фигура. У этой фигуры есть кривые. У каждой кривой есть точки. У каждой точки есть свои координаты.

Написал код, где используются интерфейсы. Код почти готов, только в одном месте ошибка появляется.
C#
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
using System;
using System.Collections.Generic;

namespace Черновик17
{
    //Интерфейсы
    //Точка
    public interface IPoint
    {
        //Получить координату X
        double GetX();
        //Получить координату Y
        double GetY();
    }

    //Кривая линия из точек
    public interface IСurve
    {
        //Получить Point
        IPoint GetPoint(int id);
    }

    //Фигура (набор кривых)
    public interface IFigure
    {
        //Получить кривую
        IСurve GetSection(int id);
    }

    //Добавление точек в кривую
    public interface IСurveModification
    {        
        void AddPoint(double x, double y);
    }

    //Добавление одного набора кривых в фигуру
    public interface IFigureModification
    {
        void AddСurve(IСurve curve);
    }


    //Классы и реализация интерфейсов
    public class Point : IPoint
    {
        public double X;
        public double Y;

        public Point(double x, double y)
        {
            this.X = x;
            this.Y = y;
        }

        double IPoint.GetX()
        {
            return X;
        }

        double IPoint.GetY()
        {
            return Y;
        }
    }

    public class Сurve : IСurve, IСurveModification
    {
        public List<Point> points;

        public Сurve()
        {
            points = new List<Point>();
        }        

        IPoint IСurve.GetPoint(int id)
        {
            return points[id];
        }

        void IСurveModification.AddPoint(double x, double y)
        {
            points.Add(new Point(x,y));
        }
    }

    class Figure : IFigure, IFigureModification
    {
        public List<Сurve> curves;

        public Figure()
        {
            curves = new List<Сurve>();
        }

        IСurve IFigure.GetSection(int id)
        {
            return curves[id]; 
        }         

        void IFigureModification.AddСurve(IСurve curve)
        {
            curves.Add(curve); //Тут появляется ошибка.
            //"Аргумент 1: не удается преобразовать из "Черновик17.IСurve" в "Черновик17.Сurve""
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Figure figure = new Figure();
            //figure.
            Console.ReadKey();
        }
    }
}

Скажите, как правильно преобразовать?
...
Рейтинг: 0 / 0
10.02.2020, 20:17
    #39924926
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Что мешает объявить
Код: c#
1.
curves = new List<IСurve>();
...
Рейтинг: 0 / 0
10.02.2020, 21:10
    #39924941
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Shocker.Pro
Что мешает объявить
Код: c#
1.
curves = new List<IСurve>();

Вы имеете в виду так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...
class Figure : IFigure, IFigureModification
    {
        public List<Сurve> curves;

        public Figure()
        {
            curves = new List<IСurve>();
        }

        IСurve IFigure.GetSection(int id)
        {
            return curves[id]; 
        }         

        void IFigureModification.AddСurve(IСurve curve)        {

            curves.Add(curve);
        }
    }
...
...
Рейтинг: 0 / 0
10.02.2020, 23:41
    #39924971
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
да, ну и соответствующим образом изменить объявление типа поля
...
Рейтинг: 0 / 0
11.02.2020, 09:56
    #39925041
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Shocker.Pro,

Получилось. Спасибо!
...
Рейтинг: 0 / 0
11.02.2020, 11:24
    #39925091
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
надо свойство завести, а поле инкапсулировать
...
Рейтинг: 0 / 0
11.02.2020, 11:42
    #39925102
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
В методе Main нужно написать так:
Код: c#
1.
figure.AddСurve();


На скриншоте в списке методов отсутствует метод AddСurve.

Если написать public
Код: c#
1.
2.
3.
4.
public void IFigureModification.AddСurve(IСurve curve)
{
    curves.Add(curve);
} 

то выдает ошибку: "Модификатор public не допустим для этого элемента".

Почему так? Как правильно написать?
...
Рейтинг: 0 / 0
11.02.2020, 11:44
    #39925104
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Если добавить такую запись
Код: c#
1.
2.
3.
4.
5.
6.
public int AddСurve1(int x)
        {
            IFigureModification ob;
            ob = this;
            return ob.AddСurve(x); //вызов интерфейсного метода IFigureModification
        }

то метод AddСurve1 (не AddСurve ) появляется в списке методов. См. скриншот.

Я правильно понимаю, что в данном случае не обойтись без дополнительного метода AddСurve1 ? Или можно было сделать по проще, то есть все в методе IFigureModification.AddСurve реализовать?
...
Рейтинг: 0 / 0
11.02.2020, 11:46
    #39925106
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
читайте, просвещайтесь :D https://metanit.com/sharp/tutorial/3.44.php
...
Рейтинг: 0 / 0
11.02.2020, 11:56
    #39925111
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Roman Mejtes
надо свойство завести, а поле инкапсулировать
Вы имеете ввиду сделать список curves как private свойство в самом классе Figure и добавить get и set?
...
Рейтинг: 0 / 0
11.02.2020, 12:09
    #39925121
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
При EIMI вызов метода возможен только при явном кастинге к эксплицитно реализованному интерфейсу. В коде экземпляр Figure нужно явно кастить к IFigureModification.
Отдельный вопрос, занафига тут потребовалось применять EIMI.
...
Рейтинг: 0 / 0
11.02.2020, 12:47
    #39925152
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Roman Mejtes
читайте, просвещайтесь :D https://metanit.com/sharp/tutorial/3.44.php
Спасибо!

Еще такой вариант:
Код: c#
1.
2.
3.
4.
5.
6.
7.
Curve curve1 = new Curve();
((IСurveModification)curve1).AddPoint(10, 20);
((IСurveModification)curve1).AddPoint(11, 21);
((IСurveModification)curve1).AddPoint(12, 22);

Figure figure = new Figure();
((IFigureModification)figure).AddСurve(curve1);   
...
Рейтинг: 0 / 0
11.02.2020, 17:14
    #39925310
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
ferzmikk
то выдает ошибку: "Модификатор public не допустим для этого элемента".

Это явная (explicit) реализация интерфейса и у неё не может быть модификатора доступа. Де-факто такой метод является приватным. С тем отличием, что его все-таки можно вызвать из другого класса (в том числе и производного), приведя ссылку на объект к ссылке на интерфейс.

Но, вообще говоря, интерфейсы так использовать не стоит по идеологическим соображениям.
...
Рейтинг: 0 / 0
11.02.2020, 20:12
    #39925388
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
fkthat
Но, вообще говоря, интерфейсы так использовать не стоит по идеологическим соображениям.
Вы имеете ввиду вызов интерфейсного метода? А как рекомендуется использовать?
...
Рейтинг: 0 / 0
11.02.2020, 21:38
    #39925414
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
ferzmikk
fkthat
Но, вообще говоря, интерфейсы так использовать не стоит по идеологическим соображениям.
Вы имеете ввиду вызов интерфейсного метода? А как рекомендуется использовать?

Нет я имею в виду что-то типа IPoint или ICurve. Как бы в двух словах объяснить, наследование это "Я есть что-то", а интерфейс это "Я умею что-то" или "Со мной можно сделать то-то". "Собака это млекопитающее", "Кошка это млекопитающее" - наследование. А "Собака кусается" и "Кошка кусается" это уже интерфейс - надо исходить из этого. Вот, например в твоей реализации можно создать класс, который будет одновременно и точкой, и кривой, и фигурой из кривых, что смысла никакого не имеет.
...
Рейтинг: 0 / 0
11.02.2020, 21:49
    #39925416
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
ferzmikk
Вы имеете ввиду вызов интерфейсного метода?

Интерфесный метод как раз норм. Есть люди которые даже считают, что все реализации интерфейсов должны быть explicit. Я даже с этим согласен, но, это просто довольно таки непривычно так делать, поэтому сам не делаю.
...
Рейтинг: 0 / 0
12.02.2020, 06:01
    #39925458
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
fkthat
Есть люди которые даже считают, что все реализации интерфейсов должны быть explicit.

Интересно было бы послушать их аргументацию. Тот же Рихтер рекомендует сто раз подумать, прежде чем без необходимых причин (совпадение сигнатур методов) прибегать к EIMI. У майкрософта в исходниках я EIMI встречал тоже только в таких случаях.
...
Рейтинг: 0 / 0
12.02.2020, 07:59
    #39925464
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Сон Веры Павловны
Интересно было бы послушать их аргументацию.

Ну, я бы, например, как аргумент в пользу explicit мог бы привести принцип "dependency inversion" из SOLID - то что любой класс/объект не должен использоваться напрямую, а только через свои абстрактные контракты. Понятно, что explicit не мешает этот принцип нарушать (в конце-концов всегда класс можно привести к своему интерфейсу), но, типа, как бы, подталкивает к его соблюдению.

Сон Веры Павловны
Тот же Рихтер рекомендует сто раз подумать, прежде чем без необходимых причин (совпадение сигнатур методов) прибегать к EIMI

А где Рихтер такое писал, кстати? Я у него не припомню, чтобы встречал такое, что прямо так explicit это гамно и костыль.
...
Рейтинг: 0 / 0
12.02.2020, 08:30
    #39925468
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
fkthat
А где Рихтер такое писал, кстати?

CLR via C#

Глава 13. Интерфейсы C#
...
Рейтинг: 0 / 0
12.02.2020, 08:32
    #39925469
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Рихтерк явной реализации интерфейсных методов нужно прибегать с осторожностью. Когда разработчики впервые узнали о EIMI, многие посчитали это
отличной новостью и стали пытаться выполнять явную реализацию интерфейсных
методов везде, где только можно. Не попадайтесь на эту удочку! Явная реализация
интерфейсных методов полезна в лишь некоторых случаях, но ее следует избегать
везде, где можно обойтись другими средствами.
...
Рейтинг: 0 / 0
12.02.2020, 10:00
    #39925486
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Изопропил,

Да, заглянул, нашел. Я её просто сразу главы с 25 читал. Но надо сказать, что аргументы, что он приводит против, тоже так-сяк себе. Я сам-то EIMI не использую без крайней нужды, но, сказал бы просто, что я не вижу как каких-либо особых аргументов "за", так и особых аргументов "против".
...
Рейтинг: 0 / 0
12.02.2020, 11:13
    #39925520
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
fkthat,

да мало что кто то что то сказал - это равносильно тому что - не пользуйтесь готовыми библиотеками, пишите все сами
...
Рейтинг: 0 / 0
12.02.2020, 12:02
    #39925557
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
fkthat
так и особых аргументов "против"

Особый аргумент против - нужно было бы писать постоянный явный кастинг. Представьте себе, что так оно и было бы:
Код: c#
1.
2.
3.
4.
5.
using(var disposable = (IDisposable)sqlCommand.ExecuteReader())
{
  var reader = (IDataReader) disposable;
  ...
}


- я бы проклял автора идеи повсеместного EIMI страшными словами.
...
Рейтинг: 0 / 0
12.02.2020, 13:11
    #39925621
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
Сон Веры Павловны

Особый аргумент против - нужно было бы писать постоянный явный кастинг. Представьте себе, что так оно и было бы:
Код: c#
1.
2.
3.
4.
5.
using(var disposable = (IDisposable)sqlCommand.ExecuteReader())
{
  var reader = (IDataReader) disposable;
  ...
}


- я бы проклял автора идеи повсеместного EIMI страшными словами.

Если следовать Dependency Inversion то ссылки практически на любые объекты присутствуют в коде только как ссылки на их интерфейсы, так что кастинг не нужен.

Кстати, попробуй из своего кода убрать кастинги - возможно удивишься тому что все отлично соберется :)

Сон Веры Павловны
я бы проклял автора идеи повсеместного EIMI страшными словами.

Я везде его использовать не считаю прямо-таки суперхорошей идеей, но, если бы, вдруг, на проекте всей команде в голову взбрело так делать, то меня бы это не сильно уж и напрягло и детских истерик я бы устраивать из-за этого не стал бы точно.
...
Рейтинг: 0 / 0
12.02.2020, 14:25
    #39925721
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается преобразовать
fkthat
Кстати, попробуй из своего кода убрать кастинги - возможно удивишься тому что все отлично соберется :)

Ну а с чего бы не собраться - сейчас же все приведенные в коде интерфейсы реализованы неявно. Это была просто гипотетическая иллюстрация возможной ситуации.

fkthat
если бы, вдруг, на проекте всей команде в голову взбрело так делать, то меня бы это не сильно уж и напрягло и детских истерик я бы устраивать из-за этого не стал бы точно.

Для того, чтобы это не напрягало, архитектура должна быть спроектирована соотвествующим образом. А если тебе просто дают экземпляр какого-то объекта, и для того, чтобы вызвать нужный метод, надо а) знать список всех интерфейсов, которые имплементирует этот объект; 2) знать интерфейс, в котором объявлен нужный метод; 3) сделать тайпкастинг к этому интерфейсу. Примерно то же самое, что работать просто с object, угадывая, что там на самом деле.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не удается преобразовать / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]