Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоковые операторы << и >> в C# ... ...это возможно ? 
:(
    Опции темы
mr.DUDA
  Дата 26.6.2004, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Очень огорчился, узнав, что переопределить операторы << и >> в своём классе можно только для аргумента типа int, т.е. нельзя например сделать как в С++:
Цитата
cout<<"test text"<<1<<2<<3<<" hehe.";


Неужели в майкрософте просто забыли об этой удобной фиче ?.... butbut.gif

Вот мои соображения по поводу, как можно обойти это ограничение:
1) кастовать свои типы в тип int (естессна, int-ом будет какой-то ID)
2) передавать полученный int в потоковый оператор <<
3) в потоковом операторе "восстанавливать" объект по int-у
4) далее потоковый оператор делает свою работу над объектом, т.е. сохраняет его в файл, выводит на консоль и т.п.

Конечно, придётся порождать свои объекты от некоего базового класса, поддерживающего неявное преобразование к int-у. Кроме того, придётся "завернуть" многие базовые типы (такие как строки и пр.) в свои классы. Но это уже как говорится, развитие идеи.

Вот что у меня получилось:
Цитата
using System;
using System.Collections;

namespace _TestApp
{
   
// Базовый класс для всех типов, поддерживающих преобразование
    // к типу int и обратно
   
public class CStreamable
    {
       
private static Hashtable tbObjects = new Hashtable();
       
private static int lastId = 0;
       
       
public static int ToInt(CStreamable obj)
        {
            tbObjects.Add(lastId, obj);
           
return lastId++;
        }

       
public static CStreamable FromInt(int id)
        {
            CStreamable obj = (CStreamable)tbObjects[id];
            tbObjects.Remove(id);
           
return obj;
        }

       
public static implicit operator int(CStreamable obj)
        {
           
return ToInt(obj);
        }
    }

   
// класс потока, поддерживающий операции << и >>
   
public class some_stream
    {
       
public static some_stream operator << (some_stream stream, int i)
        {
            CStreamable obj = CStreamable.FromInt(i);           
           
return stream;
        }

       
public static some_stream operator >> (some_stream stream, int i)
        {
            CStreamable obj = CStreamable.FromInt(i);           
           
return stream;
        }
    }

   
//////////////////////////////////////////////////////////////

   
    // класс, производный от CStreamable
    // объекты этого класса мы будем посылать и принимать из потока
   
public class CDerivedStreamable: CStreamable
    {
       
public int x;
       
public CDerivedStreamable(int i) {x=i;}
    }


   
public class Tester
    {
       
// тестовая функция
       
public void Test()
        {
           
           
// создаём объект "поток"
           
some_stream s = new some_stream();
           
           
// создаём 2 объекта для сохранения и загрузки из потока
           
CDerivedStreamable obj1 = new CDerivedStreamable(1);
            CDerivedStreamable obj2 =
new CDerivedStreamable(1);

           
// отправка объектов в "поток ввода-вывода"
            // (на самом деле ничего не происходит)
           
s <<= obj1 << obj2;

           
// получение объектов из "потока ввода-вывода"
           
s >>= obj1 >> obj2;
           
        }
    }
}


Просьба не пинать ногами, я в шарпе совсем новичок hehe.gif

Заранее спасибо за ответ.


--------------------
user posted image
PM MAIL WWW   Вверх
Kurt
Дата 26.6.2004, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Интересно..
Вот только я немного не пойму практическую сторону дела.
Зачем нужно такое переопределение, да и вообще зачем этот ">>" нужен...
Приведи, пожалйста, пример.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
mr.DUDA
Дата 26.6.2004, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Привожу. Тот же BinaryWriter/Reader было бы проще использовать, если бы вместо вызова "Read" или "Write" для каждой переменной можно было пользоваться "потоковыми" операторами:
Цитата
BinaryWriter writer;
           
string str = "AAA";
int x = 1;
float f = 2;
   
writer "str=" << str << ", x=" << x << ", f=" << f;


В VC++ можно создать свой класс (например, лог-файл), в котором переопределить операторы << и >> (например, для записи в лог-файл различных значений, строк, тек. времени и пр.).

Последний довод - с консолью было бы удобнее (если и не удобнее, то хотя бы интуитивно понятнее) работать с пом. этих операторов.

З.Ы. Пришёл, понимаешь, сишник -- и давай права качать wink.gif ...
Добавлено @ 14:09
З.Ы. я знаю о возможности делать типа такого: Console.WriteLine(" str = {0}, x = {1}", str, x)... но хотелось бы всё-таки чего-то добиться и от <</>>... rolleyes.gif


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.