Змінюй хід війни! Допомагай ЗСУ!

C# полиморфизм

  • Автор теми Автор теми -zidan-
  • Дата створення Дата створення
А как потом с этим работать?


Помоему вы меня не поняли. Ни я ни компилятор на момент компиляции не знает какие у меня типы сидят в телеграмме.!!!

Если даже Вы не знаете какие типы у вас сидят в телеграмме, то С ЧЕМ вы собираетесь работать??? Вы городите бред, не удивительно что с Вас уже прикалываются!

Извините, а кто за Вас должен решать? Или Вы, может быть, думаете что получив любую пачку байт, компьютер произнесёт магическое заклинание "сим-салябим-полиморфизм!!!", и распихает эти байты по переменным разных типов, основываясь на.... чём ???
 
Код:
foreach (ReciveData d in structTelegram)
                    {
                        d.Parse(readBuff);
                    }

Давайте уточним:
какого типа readBuff и что там вообще?
как происходит процесс наполнения structTelegram? на основании чего выбирается экземпляр того или иного наследника?
 
Давайте уточним:
какого типа readBuff и что там вообще?
как происходит процесс наполнения structTelegram? на основании чего выбирается экземпляр того или иного наследника?

На самом деле кодвыглядет так:
Код:
foreach (ReciveData d in structTelegram)
                    {
                        d.Parse(readBuff, i);
                        i += d.SizeData;
                    }
где readBuff - массив byte получиных из вне;
i - смещение;
d.SizeData - размер в байтах соответствующего типа наследника(он у наследников разный)
structTelegram - контейнер List<ReciveData> в котором лежат наследники базового класса ReciveData. Эта и есть структура телеграммы которую я получаю. Эту структуру я формирую в процессе выполнения программы.
 
Код:
public abstract class MyClass
{
   public abstract MyMethod(ObjectHolder obj);
}

Что касается телеграммы:

Код:
public class ReceiveData
{
   public virtual void Parse(string data) { }
}

в чем вопрос? и что конкретно нужно сделать?

..............

И загрузку байтов при закрытии/открытии приложения и байты будут накапливаться с каждым днем :D

Это именно то,чему удивлялось и не перестает удивляться мировое сообщество ит -технологий.Там где человечество искало ответы целые поколения,отечественный производитель разрешил в два приема.
Замечу,что такое решение подходит практически к любой накопительной задаче и практически в любой области ,где происходят накопительные процессы,начиная от сантехника,прочищающего стоки и кончая гидрометрцентром,передающим сводку погоды на месяц.
Также отмечу,создатели такого направления в развитии ит-технологий на сегодняшний день имеют огромное количество учеников,что говорит о том,что они развиваются и безусловно займут доминирующие места в областях програмно-накопительных практики и теории.
 
Давайте уточним:
какого типа readBuff и что там вообще?
как происходит процесс наполнения structTelegram? на основании чего выбирается экземпляр того или иного наследника?


мне нравится ход Вашей мысли и кривой путь логики.



ИБВ



а какие при этом происходят процессы?
Ну что ты,парниша,прикалываешся.Компилятор разный бывает,однопроходной,многопроходной,с разными степенями контроля по результирующей смещения и т.д.
Учитывая твои проблемы с успеваемостью,обозначу на примере .
Например дан шаблон функции,умеющей сравнивать целые,дробные,символьные переменные.По логике сравнение целой и символьной не должно иметь проблем,но реально получается сравнение неправильное.Тогда мы обьявляем функцию сравнения ф(инт,инт).
Тогда компилятор,формируя рядок функций по шаблону в количестве,равном числу необходимых,явно приведет ,встретив параметры инт ,чар,к параметру инт,инт.
 
Останнє редагування:

масел масленных.

Тогда компилятор,формируя рядок функций по шаблону в количестве,равном числу необходимых,явно приведет ,встретив параметры инт ,чар,к параметру инт,инт.

компилятор ничего не приводит. садись, два.
 
ТС, можеш конецно написать такое :D :
Код:
public interface IParsable
    {
        public void Parse(int[]buff, int i);
    }
public class MySuperNewData : IParsable
    {
        public void Parse(int[] buff, int i)
        {
            //парсим
        }
    }
public class MySuperPuperNewData : IParsable
    {
        public void Parse(int[] buff, int i)
        {
            //парсим
        }
    }

List<IParsable> structTelegram = new List<IParsable>
//заполняеш как-то список (????)
foreach (IParsable d in structTelegram)
{
          d.Parse(readBuff, i);
          i += d.SizeData;
}
да только что дальше? :D
Тебе же неизвестны типы в телеграмме, КАК ты будеш заполнять список?
 
ТС по-моему бинарная десериализация нужна, а не полиморфизм :) Да и то для этого надо знать структуру потока данных, а откуда она берется и жестко ли заданная, или зависит от предыдущих данных в потоке - ТС пока молчит
 
кто это уже нажаловался там? преподы? не обижайтесь, просто было очень смешно, как один из них сразу же предложил делать "по-нормальному", при том, что саму задачу ТС четко до сих пор не объяснил.
ещё и про обобщения вспомнил. интересно, преподы отличают переходы "от частного к общему" и "от общего к частному"?

к ТСу вопрос. что известно о структуре "телеграммы" вообще? правильно ли я понял, что её структура ясна до начала парсинга и по ней заполнен список structTelegram наследниками ReciveData (пишется receive)?
 
Вы видите,Айлендэ,скоко парней ведут задачку,видно в прошлом заработали по 12 число,дальше не хватило.
Однако ,отметим,
чтобы было много работы,много денег,надо дать свободу мышления каждому,это приводит к космическому обмену данными,что образует поток идей,теорий всевозможных,и каждый черпает в этом потоке свое,так формируется возможность реализации .
В прошлом году группу горил,которые проводили теоретическую трассировку айпи маршрутов,мы состыковали с 12 крысами,фактически прошедшими около 8 маршрутов,результат превзошел себя.
Были сформированы парсинговые структуры файлов сооки в точках соприкосновения с инет ресурсами и отправлены к месту дислокации лабораторного сервера.



Код:
public interface IParsable
    {
        public void Parse(int[]buff, int i);
    }
public class MySuperNewData : IParsable
    {
        public void Parse(int[] buff, int i)
        {
            //парсим
        }
    }
public class MySuperPuperNewData : IParsable
    {
        public void Parse(int[] buff, int i)
        {
            //парсим
        }
    }

List<IParsable> structTelegram = new List<IParsable>
//заполняеш как-то список (????)
foreach (IParsable d in structTelegram)
{
          d.Parse(readBuff, i);
          i += d.SizeData;
}

Мне код очень понравился.Гибко и мягко и логически,синтаксически определен правильно.Дали понюхать нашей девочке,не отвернула голову,а наоборот проявила внимание.



Дорогие мои соотечественники !
Поздровляю всех с наступающим в некотором календаре Новым годом .
Счастья вам,морального и материального ,пусть всегда будет на вашем столе печенье и сыр.Пусть ваши кладовки всегда будут полны мешками с всевозможными крупами.Пусть всегда будет на вашей клавиатуре свеже крошки от бутербродов с колбасой и икрой.Мир вам и голубое синее небо.
 
Останнє редагування:
ТС, можеш конецно написать такое :D :

Это я уже давно написал и помоему писал и выше, только я делал через абстрактный базовый класс. Что на мой взгляд в данном случае не имеет значения.

да только что дальше? :D
Тебе же неизвестны типы в телеграмме, КАК ты будеш заполнять список?
мне неизвестны (на этапе компиляции), но пользователь знает и я ему предлагаю сформировать структуру телеграммы (разумеется до того как посылки начнут приходить).

neocortex; сказав(ла):
ТС по-моему бинарная десериализация нужна, а не полиморфизм

Может, я не вижу, покажите как?

HelloWorld; сказав(ла):
к ТСу вопрос. что известно о структуре "телеграммы" вообще? правильно ли я понял, что её структура ясна до начала парсинга и по ней заполнен список structTelegram наследниками ReciveData (пишется receive)?

Да.

Губитель; сказав(ла):
Мне код очень понравился.Гибко и мягко и логически,синтаксически определен правильно.Дали понюхать нашей девочке,не отвернула голову,а наоборот проявила внимание

Ну так полиморфизм.
 
А как потом с этим работать?

например так:
Код:
public interface IParser
{
   void Parse(object obj);
}

public class Parser1 : IParser
{
    void IParser.Parse(object obj)
    {
        Parse((ExtraObject1)obj);
    }

    public void Parse(ExtraObject1 obj)
    {

    }
}

только зачем непонятно, сама идея говорит о том что делать нужно по другому.

Может, я не вижу, покажите как?

Код:
public abstract void SaveTo(Stream stream);

public abstract void LoadFrom(Stream stream);
 
Помогите решить следующий вопрос:
Мне бы хотелось в абстрактном базовом классе обьявить абстрактную функцию которая принимает один аргумент и возвращает void, но в производных классах этот аргумент предпологаеться различным. Возможно нужно реализовать все через object, но может есть другие варианты? Чтото типа шаблонной функции?
Эту функцию в последствии предпологаю вызывать в цикле по массиву ссылок на базовый класс.

......................................
Это я уже давно написал и помоему писал и выше, только я делал через абстрактный базовый класс. Что на мой взгляд в данном случае не имеет значения.
Отлично, раз вы во всём разобрались! Осталось только наполнить коллекцию, и всё будет работать. :клас:
 
например так:
Код:
public interface IParser
{
   void Parse(object obj);
}

public class Parser1 : IParser
{
    void IParser.Parse(object obj)
    {
        Parse((ExtraObject1)obj);
    }

    public void Parse(ExtraObject1 obj)
    {

    }
}

только зачем непонятно, сама идея говорит о том что делать нужно по другому.



Код:
public abstract void SaveTo(Stream stream);

public abstract void LoadFrom(Stream stream);

Честно говоря все равно непонятно.

Отлично, раз вы во всём разобрались! Осталось только наполнить коллекцию, и всё будет работать. :клас:

Вот этим и буду заниматься в скором времени. Создам соответствующую форму с нужными полями. Через форму буду добовлять наследников.

Конкретно вопрос состоял в том что я немог понять следующее:
наследники в своей базе содержат разные данные(int, double, DateTime) мне необходимо вводить различные значения привязанные к базе (maxValue, minValue и т.д.) я както запутался как делать.

Но теперь понял мне нужно обьявить метод в абстрактном базавом классе:
void SetMaxValue(string);
а внутри в наследниках парсить string посвоему.

А пока до меня дошло, мне попытались объяснить что я не так делаю. Хотя в итоге пришли к одному и томуже. Может конечно есть другие способы решения моей задачи но я их не вижу.

Возможно можно былобы применить позднее связование но...
 
Как всегда,все обозначилось(несмотря на явное настаивание преподов,внимательней отнестись к содержимому носителя информации по посылке) так как кто знает о телеграммах :точка-тере,в современной интерпретации свернулось к string в силу железной логики эволюции.
 
Назад
Зверху Знизу