Дженериковая коллекция интерфейсов - возможно ли?
От: VadNuNik Россия macmaniak.narod.ru
Дата: 21.05.08 19:33
Оценка:
Хочется странного. Вот тестовый код

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace AbstrListTest
{
    public interface IFoo
    {
        void Bar();
    }

    public class RealFoo : IFoo
    {
        public void Bar()
        {
            Debug.Print("Call the realization");                        
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            List<RealFoo> src = new List<RealFoo>();

            for(int i=0; i<10; i++)
                src.Add(new RealFoo());

            // Собственно вот тут заключен вопрос - 
            // как обратиться к коллекции через ее интерфейс
            // при этом перебрав элементы так же через их интерфейсы 
            IList<IFoo> dst = src;

            foreach (IFoo obj in dst)
                obj.Bar();
        }
    }
}


Возможно ли это принципиально? Мож как-то хитро нужно реализовать коллекцию?
Re: Дженериковая коллекция интерфейсов - возможно ли?
От: Lloyd Россия  
Дата: 21.05.08 19:41
Оценка:
Здравствуйте, VadNuNik, Вы писали:

VNN>Возможно ли это принципиально? Мож как-то хитро нужно реализовать коллекцию?


List<IRealFoo> src = new List<IRealFoo>();
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: Дженериковая коллекция интерфейсов - возможно ли?
От: VadNuNik Россия macmaniak.narod.ru
Дата: 21.05.08 19:47
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>List<IRealFoo> src = new List<IRealFoo>();


Эт я понимаю, но мне хотелось бы обращаться к коллекциям (их много), содержащим реализации интерфейса IRealFoo, в том то и фишка.
Re: Дженериковая коллекция интерфейсов - возможно ли?
От: desco США http://v2matveev.blogspot.com
Дата: 21.05.08 20:22
Оценка:
Здравствуйте, VadNuNik, Вы писали:

<skipped/>


using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

public interface IFoo
{
    void Bar();
}

public class FooImpl1 : IFoo
{
    #region IFoo Members

    public void Bar()
    {
        Debug.Print("Impl1:Bar");
    }

    #endregion
}

public class FooImpl2 : IFoo
{
    #region IFoo Members

    public void Bar()
    {
        Debug.Print("Impl2:Bar");
    }

    #endregion
}

internal static class Program
{
    private static List<T> CreateList<T>()
        where T : new()
    {
        return Enumerable.Range(0, 5).Select(x => new T()).ToList();
    }

    private static void InvokeBar<T>(this IEnumerable<T> list)
        where T : IFoo
    {
        foreach (var v in list)
            v.Bar();
    }

    public static void Main()
    {
        var impl1 = CreateList<FooImpl1>();
        var impl2 = CreateList<FooImpl2>();

        impl1.InvokeBar();
        impl2.InvokeBar();
    }
}

?
Re[3]: Дженериковая коллекция интерфейсов - возможно ли?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.05.08 20:25
Оценка:
Здравствуйте, VadNuNik, Вы писали:

VNN>Здравствуйте, Lloyd, Вы писали:


L>>List<IRealFoo> src = new List<IRealFoo>();


VNN>Эт я понимаю, но мне хотелось бы обращаться к коллекциям (их много), содержащим реализации интерфейса IRealFoo, в том то и фишка.


using System;
using System.Linq;
using System.Diagnostics;
using System.Collections.Generic;

namespace AbstrListTest
{
    public interface IFoo
    {
        void Bar();
    }

    public class RealFoo : IFoo
    {
        public void Bar()
        {
            Console.WriteLine("Call the realization");
        }
    }

    public class Program
    {
        public static void Main()
        {            
            List<RealFoo> src = new List<RealFoo>();

            for (int i = 0; i < 10; i++)
                src.Add(new RealFoo());

            // Собственно вот тут заключен вопрос - 
            // как обратиться к коллекции через ее интерфейс
            // при этом перебрав элементы так же через их интерфейсы 
            
            //IList<IFoo> dst = src.OfType<IFoo>().ToArray();//Можно так
            IEnumerable<IFoo> dst = src.OfType<IFoo>(); //Лучше так

            foreach (IFoo obj in dst)
                obj.Bar();
        }
    }
}
Re[4]: Дженериковая коллекция интерфейсов - возможно ли?
От: _FRED_ Черногория
Дата: 21.05.08 20:37
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>//IList<IFoo> dst = src.OfType<IFoo>().ToArray();//Можно так
G>IEnumerable<IFoo> dst = src.OfType<IFoo>(); //Лучше так

Почему не Cast?
Help will always be given at Hogwarts to those who ask for it.
Re: Дженериковая коллекция интерфейсов - возможно ли?
От: febus Германия  
Дата: 21.05.08 21:05
Оценка:
Здравствуйте, VadNuNik, Вы писали:
а можно глупый встречный вопрос:
Почему бы не написать просто

foreach (IFoo obj in src)


т.е. вместо dst просто src?
Re[2]: Дженериковая коллекция интерфейсов - возможно ли?
От: VadNuNik Россия macmaniak.narod.ru
Дата: 21.05.08 21:53
Оценка:
Здравствуйте, febus, Вы писали:

F>Почему бы не написать просто


F>
F>foreach (IFoo obj in src)
F>


F>т.е. вместо dst просто src?


Дык этож тест :) , у меня есть n-ое количество коллекций объктов реализующих определенный интерфейс, в некоторых случаях весьма удобно пройтись по этим коллекциям именно как по коллекциям интерфейсов. В приницпе, если есть какой-то другой путь красивой реализации данной задачи то это то же приветствуется :-)
Re[2]: Дженериковая коллекция интерфейсов - возможно ли?
От: VadNuNik Россия macmaniak.narod.ru
Дата: 21.05.08 21:56
Оценка:
Здравствуйте, desco, Вы писали:

D>
D>internal static class Program
D>{
D>    private static List<T> CreateList<T>()
D>        where T : new()
D>    {
D>        return Enumerable.Range(0, 5).Select(x => new T()).ToList();
D>    }

D>    private static void InvokeBar<T>(this IEnumerable<T> list)
D>        where T : IFoo
D>    {
D>        foreach (var v in list)
D>            v.Bar();
D>    }

D>    public static void Main()
D>    {
D>        var impl1 = CreateList<FooImpl1>();
D>        var impl2 = CreateList<FooImpl2>();

D>        impl1.InvokeBar();
D>        impl2.InvokeBar();
D>    }
D>}
D>

D>?

Сильно! Доберусь до работы, в любом случае попробую как это работает :-)
Re: Дженериковая коллекция интерфейсов - возможно ли?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 22.05.08 01:28
Оценка:
Здравствуйте, VadNuNik, Вы писали:

В текущей версии C# ковариантности у дженериков нет. Так что то, что ты хочешь напрямую в шарпе невозможно.
... <<RSDN@Home 1.2.0 alpha 4 rev. 1082 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[4]: Дженериковая коллекция интерфейсов - возможно ли?
От: VadNuNik Россия macmaniak.narod.ru
Дата: 22.05.08 18:34
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>
G>using System.Linq;
G>

Дык этож 3-я версия фреймворка! Вопщем выкрутился б.м. прилично :-)

Всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.