Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 19 odgovora
  • 5.609 pregleda

Najnovija ↓

Interfejsi i genericsi 07.09.2014. u 22:39 · pre 147 meseci #1
Zamisao:

Code (csharp):

public interface IBar
{
    void BarDo();
}

public interface IFoo
{
    List<IBar> Bars {get;set;}
}

public class MyClass
{
    public IFoo FooImplementation {get;set;}

    public void Do()
    {
         FooImplementation.Bars.ForEach(b => b.BarDo());
    }
}
 


Code (csharp):

public class Bar : IBar
{
    public void BarDo() { }
}

public class Foo : IFoo
{
    public List<Bar> Bars {get;set;}
}

public class Program
{
    public void Main()
    {
        MyClass mc = new MyClass();
        mc.FooImplementation = new Foo();
        mc.Do();
    }
}
 



Ok, kod je neispravan ali oslikava sta hocu. Dakle, problem je sto List<Bar> Bars nije implementacija List<IBar> Bars. To je jasno i logicno (iako malo kontraintuitivno) i to nije problem.

Problem je sto mi stao mozak i nemam ideju kako da uradim na drugi nacin... :)
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Interfejsi i genericsi 08.09.2014. u 10:22 · pre 147 meseci #2
Mozda
Code (csharp):

public class Foo : IFoo
{
    public List<IBar> Bars {get;set;}
}
 
?
Re: Interfejsi i genericsi 08.09.2014. u 10:36 · pre 147 meseci #3
Moram imati konkretnu implementaciju*. OK bi bilo da imam i jedno i drugo kada bih mogao u getter-u za List<IBar> Bars da vracam istu listu koja je i za property tipa List<Bar>. Imao bih dupli property ali to nije problem, nego je problem sto ne moze :)


*Ovo je pojednostavljen primer, Bar je zapravo entity klasa za EntityFramework a Foo je interface koji klasa koja nasledjuje DbContext treba da implementira. DbContext ne prihvata interfejs, samo klasu.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Interfejsi i genericsi 08.09.2014. u 10:52 · pre 147 meseci #4
Citat:

Moram imati konkretnu implementaciju*.

Ondak ti verovatno ne treba interfejs :)
Potpis
Viva lollapalooza
Re: Interfejsi i genericsi 08.09.2014. u 11:00 · pre 147 meseci #5
Treba mi :) OK, ne obavezno, ali ne vidim kako drugacije.

Ako pogledas prvi kod, tamo je klasa MyClass koja nesto radi sa tim interfejsima a potrebno je da joj se ubaci konkretna implementacija.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Interfejsi i genericsi 08.09.2014. u 11:13 · pre 147 meseci #6
onda mozda ovako nesto
Code:

public class Foo<T> : IFoo
{
    public List<T> Bars {get;set;}
}

al je onda IFoo suvisan kao sto sam rekao tj. mislim (nisam siguran) da ne mozes da templejtizujes interfejs


Potpis
Viva lollapalooza
Re: Interfejsi i genericsi 08.09.2014. u 11:16 · pre 147 meseci #7
Ok, sad cu da pogledam da probam da prokapiram sta ste hteli, ali interfejsi definitivno mogu da budu generic. Npr IList<T>, implementirajuca klasa mora da ili specijalizuje tip (class A: I<int>) ili da prenese generalziaciju (class A<T>:I<T>)

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Interfejsi i genericsi 08.09.2014. u 11:35 · pre 147 meseci #8
Ovako radi:

Code (csharp):

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

namespace SampleClasses
{

    public interface IBar
    {
        void BarDo();
    }

    public interface IFoo<T> where T:IBar
    {
        List<T> Bars { get; set; }
    }

    public class MyClass<T> where T:IBar
    {
        public IFoo<T> FooImplementation { get; set; }

        public void Do()
        {
            FooImplementation.Bars.ForEach(b => b.BarDo());
        }
    }

    public class Bar : IBar
    {
        public void BarDo() { }
    }

    public class Foo<T> : IFoo<T> where T: IBar
    {
        public List<T> Bars { get; set; }
    }

    public class Program2
    {
        public void Main()
        {
            var mc = new MyClass<Bar>();
            mc.FooImplementation = new Foo<Bar>();
            mc.Do();
        }
    }
}
 
 

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Sviđa mi se1
Re: Interfejsi i genericsi 08.09.2014. u 11:47 · pre 147 meseci #9
Hvala. Probao sam nesto slicno ali mi nije proslo a vec bilo kasno sinoc :)

Samo sto mislim da necu moci da imam <T> u MyClass<T>. Provericu. A takodje i da li moze bez a da
public IFoo<T> FooImplementation { get; set; }
bude
public IFoo<IBar> FooImplementation { get; set; }

Edit: Hm, sad kapriam da IFoo<IBar> FooImplementation nece moci, imacu slican problem kao na pocetku teme.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Interfejsi i genericsi 08.09.2014. u 12:05 · pre 147 meseci #10
Ako ti je to finalna klasa ui ne radis dalju generalizaciju ti mozes da radis specijalizaaciju u MyClass. Mada ceo ovaj primer zece krsi enkapsulaciju, MyClass bi trebao da pravi svoj FooImplementation :)

Code (csharp):

public class MyClass
     {
         public IFoo<Bar> FooImplementation { get; set; }

         public void Do()
         {
             FooImplementation.Bars.ForEach(b => b.BarDo());
         }
     }

     ...

     public class Program2
     {
         public void Main()
         {
             var mc = new MyClass();
             mc.FooImplementation = new Foo<Bar>();
             mc.Do();
         }
     }
 
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Interfejsi i genericsi 08.09.2014. u 12:29 · pre 147 meseci #11
public IFoo<Bar> FooImplementation { get; set; }
ne moze da se uradi, jer MyClass ne zna za Bar implementaciju. Implementacija je u zasebnom asembliju.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Interfejsi i genericsi 08.09.2014. u 12:31 · pre 147 meseci #12
Onda moras da ga setas :)
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Interfejsi i genericsi 08.09.2014. u 12:34 · pre 147 meseci #13
Pocetna verzija koda koji je Shadowed postavio je klasican primer ogranicenja generics-a u C# jer su invariant. Odnosno ne podrzavaju covariance/contravariance. Na primer, ako bi se IFoo u pocetnoj verziji zamenio sa

Code:
public interface IFoo
{
     IBar[] Bars {get;set;}
}


compiler ne bi prijavio gresku, ali bi se raspao u toku izvrsavanja. Zaobilazenje ovog limita genericsa obicno dovodi do narusavanja nekog od OO principa.

C# in Depth knjiga poglavlje 3.5.1 lepo to objasnjava
Sviđa mi se1
Re: Interfejsi i genericsi 08.09.2014. u 18:04 · pre 147 meseci #14
Ima tu resenja sa promenom varijance interfejsa. Npr:

Code (csharp):

    public interface IBar
    {
        void BarDo();
    }
    public interface IBar2: IBar
    {
    }

    public interface IFoo<out T> where T: IBar
    {
        IEnumerable<T> Bars { get; }
    }


    public class Bar : IBar
    {
        public void BarDo() { }
    }

    public class Bar2 : IBar2
    {
        public void BarDo() { }
    }



    public class Foo<T> : IFoo<T> where T: IBar
    {
        public List<T> Bars { get; set; }

        IEnumerable<T> IFoo<T>.Bars
        {
            get { return Bars; }
        }
    }


    public class MyClass
    {
        public IFoo<IBar> FooImplementation { get; set; }

        public void Do()
        {
            foreach (var e in FooImplementation.Bars) e.BarDo();
        }
    }

    public class Program
    {
        public void Main()
        {
            MyClass mc = new MyClass();
            // mc.FooImplementation = new Foo<Bar>();   // moze ovo
            mc.FooImplementation = new Foo<Bar2>();   // a moze i ovo (covariance)
            mc.Do();
        }
    }
 
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Interfejsi i genericsi 08.09.2014. u 19:22 · pre 147 meseci #15
Citat:
Shadowed:Dakle, problem je sto List<Bar> Bars nije implementacija List<IBar> Bars.

nije to problem jer nije ovo prosledjivanje argumenta metodi. kada implementiras metodu/svojstvo interfejsa ili apstraktne klase ili radis override virtuelne metode, moras da "prepises" doslovce potpis metode i povratnu vrednost i modifikatore jer su to jedni jedini podaci o tom clanu, ne mozes da ih menjas kako hoces.
Re: Interfejsi i genericsi 08.09.2014. u 21:43 · pre 147 meseci #16
Pa da, mora, a to se ne uklapa :) Da je IEnumerable<Bar> moglo bi (jer je IEnumerable<out T>. Medjutim, meni treba ICollection ili bilo sta sto ga nasledjuje ili implementira a on ne moze, jer nema "out".


Elem, hvala svima, mmix-ovo resenje mi odgovara. Morao sam da proverim da li ce neke druge stvari nevezane za ovaj problem moci da rade ako je MyClass generic (tj. ima type parameter). Provereno je, moze, dakle to je to :)
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Interfejsi i genericsi 08.09.2014. u 23:19 · pre 147 meseci #17
nije ovo stvar polimorfizama i varijacije, nego cisto prekucavanje metapodataka. Bars je jedno svojstvo koje ima deklaraciju na dva mesta, i ne moze na jednom da pise da mu je tip IEnumerable<IBar> a na drugom IEnumerable<Bar>.
Re: Interfejsi i genericsi 09.09.2014. u 01:33 · pre 147 meseci #18
Nije mi bas najjasnije sta si hteo da kazes.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Interfejsi i genericsi 09.09.2014. u 03:57 · pre 147 meseci #19
hteo sam da kazem da je po meni ovo

public interface IFoo
{
IEnumerable<IBar> Bars {get;set;}
}
public class Foo : IFoo
{
public IEnumerable<Bar> Bars {get;set;}
}

isto kao da si pokusao da napises

public IEnumerable<IBar> IEnumerbale<Bar> Bars {get;set;}
Re: Interfejsi i genericsi 09.09.2014. u 10:49 · pre 147 meseci #20
Pa nije isto. Na stranu sintaksna greska, radi se o jednostavnoj implementacij contracta (interfacea). Instancu klase uvek mozes da castujes u interfejs koji implementira I da pristupis preko elemenata interfejsa.

IEnumerable<Bars> treba da moze da se vidi kao IEnumerable<IBar> i u tu svrhu su i uvedene varijacije u C#. Sam objekat koji implementira IEnumerable<out T> ne mora da kovarijantan, vazno je samo da ima kovarijantnu implementaciju IEnumerable<out T> interfejsa. List<T> u Foo<T> koji sam dao ima kovarijabilni IEnumerable<IBar> jer je sa where uslovom u Foo<T> ograniceno da samo implementacije IBar-a mogu da prodju. Ostalo handluje kovarijabilnost.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme