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: Дженериковая коллекция интерфейсов - возможно ли?
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]: Дженериковая коллекция интерфейсов - возможно ли?
Здравствуйте, 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]: Дженериковая коллекция интерфейсов - возможно ли?
Здравствуйте, febus, Вы писали:
F>Почему бы не написать просто
F>
F>foreach (IFoo obj insrc)
F>
F>т.е. вместо dst просто src?
Дык этож тест :) , у меня есть n-ое количество коллекций объктов реализующих определенный интерфейс, в некоторых случаях весьма удобно пройтись по этим коллекциям именно как по коллекциям интерфейсов. В приницпе, если есть какой-то другой путь красивой реализации данной задачи то это то же приветствуется :-)
Re[2]: Дженериковая коллекция интерфейсов - возможно ли?