Dziedziczenie a szablony

0

Witam.

Spotkałem się ostatnio z taką rzeczą:

mam interfejs i dwie klasy dziedziczące z niego :

I {}

A:I {}
B:I {}

dalej mam dwie listy, każda dla osobnej klasy, oraz metode:

List<A> listA;
List<B> listB;

void meth(List<I> list) {...}

No i się dowiedziałem że nie mogę przekazać do tej metody tych list.

I zastanawiam się czy da się to zrobić tak, żeby można było przekazać jako argument te listy ? Czy jest to w ogóle niedozwolone ?</b></i>

0

Sposób w jaki zadeklarowałeś metodę meth jasno mówi, że metoda nie potrzebuje obiektów typu A lecz obiektów, które posiadają funkcjonalność interfejsu I.
Spróbuj tak:

List<I> listA = new List<I>();
listA.Add(new A());
listA.Add(new B());
listA.Add(new A());
meth(listA);

Jak widać z kolekcjami działa to trochę inaczej niż w przypadku podawania bezpośrednio pojedynczego obiektu.
</i></i>

0

Tak nie wolno, bo można by było coś takiego:

List<A> a = new List<A>;
foo(a);
//...
void foo(List<I> l)
{
  l.Add(new B());
  //jebudu - ktoś wsadził B do List<A>!
}
</i>
0

Można też użyć metody generycznej:

using System;
using System.Collections.Generic;

namespace InterfaceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            List<A> listA = new List<A>();
            listA.Add(new A());
            listA.Add(new A());
            List<B> listB = new List<B>();
            listB.Add(new B());
            listB.Add(new B());
            ShowInterface(listA);
            ShowInterface(listB);
        }

        static void ShowInterface<T>(List<T> list) 
            where T : IFace
        {
            foreach (IFace i in list)
                i.Show();
        }

    }

    interface IFace
    {
        void Show();
    }

    class A : IFace
    {
        public void Show()
        {
            Console.WriteLine("Klasa A");
        }
    }

    class B : IFace
    {
        public void Show()
        {
            Console.WriteLine("Klasa B");
        }
    }
}

</b></b>

0

Jako ciekawostkę podam, że problem ten został ujednolicony i rozwiązany w C# 4.0, który niebawem ujrzy światło dzienne.

Szczegóły: http://blogs.msdn.com/wriju/archive/2009/07/31/c-4-0-co-variance-and-contra-variance.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1