powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не удается преобразовать
25 сообщений из 26, страница 1 из 2
Не удается преобразовать
    #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
Не удается преобразовать
    #39924926
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мешает объявить
Код: c#
1.
curves = new List<IСurve>();
...
Рейтинг: 0 / 0
Не удается преобразовать
    #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
Не удается преобразовать
    #39924971
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, ну и соответствующим образом изменить объявление типа поля
...
Рейтинг: 0 / 0
Не удается преобразовать
    #39925041
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Получилось. Спасибо!
...
Рейтинг: 0 / 0
Не удается преобразовать
    #39925091
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо свойство завести, а поле инкапсулировать
...
Рейтинг: 0 / 0
Не удается преобразовать
    #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
Не удается преобразовать
    #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
Не удается преобразовать
    #39925106
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читайте, просвещайтесь :D https://metanit.com/sharp/tutorial/3.44.php
...
Рейтинг: 0 / 0
Не удается преобразовать
    #39925111
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
надо свойство завести, а поле инкапсулировать
Вы имеете ввиду сделать список curves как private свойство в самом классе Figure и добавить get и set?
...
Рейтинг: 0 / 0
Не удается преобразовать
    #39925121
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При EIMI вызов метода возможен только при явном кастинге к эксплицитно реализованному интерфейсу. В коде экземпляр Figure нужно явно кастить к IFigureModification.
Отдельный вопрос, занафига тут потребовалось применять EIMI.
...
Рейтинг: 0 / 0
Не удается преобразовать
    #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
Не удается преобразовать
    #39925310
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
то выдает ошибку: "Модификатор public не допустим для этого элемента".

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

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

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

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

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

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

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

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

CLR via C#

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

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

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

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


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

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


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

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

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

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

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

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

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

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


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