[ Sale_123 @ 03.07.2005. 22:06 ] @
Kako mogu da promenim tip argumenta prlikom nasledjivanja interfejsa

Npr.
Code:

public interface IMyList
{
public void Add (object value);
}

public class Implem : IMyList
{
public void Add (Control value)
}



Znam da je ovo moguce ali ne znam kako to izvesti. Ociti primjer je
System.Windows.Forms.Control.ControlCollection
gdje ta klasa nasledjuje IList ali matoda Add ima argument tipa Control a ne object
[ mmix @ 04.07.2005. 12:40 ] @
Ne radi se ovde o nasledjivanju nego o overloadingu... Interfejsi nemaju kod, pa ne postoji nasledjivanje interfejsa (to me najvise iritiralo u shantravim prevodima strucne literature ).
Nasledjuje se kod, ne struktura. Interfejsi se IMPLEMENTIRAJU. Sta vise, kad jedan interfejs "nasledjuje" drugi, ni to nije nasledjivanje nego prosirivanje postojeceg interfejsa. Kad klasa implementira interfejs MORA da implementira SVE metode i propertije makar oni bili prazni. Tipovi parametara cine deo potpisa metoda i ne mogu da se menjaju, tj. Add(object) i Add(Control) su dva razlicita metoda. Ono sto si ti video je ovaj kod (uprosteno)

Code:

public interface IMyList
{
public void Add (object value);
}

public class Implem : IMyList
{
   public void new Add (object value) {}
   public void new Add (Control value) {}
}


ono sto contorlcollection ima u implementaciji IList.Add metoda je:

Code:

int IList.Add(object control)
{
      if (control is Control)
      {
            this.Add((Control) control);
            return this.IndexOf((Control) control);
      }
      throw new ArgumentException("control");
}


kao sto vidi, proveri da li je object tipa COntrol i ako jeste pozove svoj ne-interfejski Add(Control).
Ono sto je ovde nezgodno je sto C# ne dozvoljava non-public implementacije interfejsa. Medjutim, bas ta klasa koju pominjes ima Add implementiran kao private, zanimljivo...
[ Sale_123 @ 05.07.2005. 12:22 ] @
Citat:
mmix: Ne radi se ovde o nasledjivanju nego o overloadingu... Interfejsi nemaju kod, pa ne postoji nasledjivanje interfejsa (to me najvise iritiralo u shantravim prevodima strucne literature :().
Nasledjuje se kod, ne struktura. Interfejsi se IMPLEMENTIRAJU. Sta vise, kad jedan interfejs "nasledjuje" drugi, ni to nije nasledjivanje nego prosirivanje postojeceg interfejsa. Kad klasa implementira interfejs MORA da implementira SVE metode i propertije makar oni bili prazni. Tipovi parametara cine deo potpisa metoda i ne mogu da se menjaju, tj. Add(object) i Add(Control) su dva razlicita metoda. Ono sto si ti video je ovaj kod (uprosteno)


Dobro sad, znam ja to ali nisam vodio racuna o terminologiji jer mi je ovo bio veci problem nego terminologija

Sto se tice zaglavlja ControlCollection.Add zaglavlje ide ovako
Code:
public virtual void Add (Control value)

to je bar ono sto pise u dokumentaciji.

Citat:
public interface IMyList
{
public void Add (object value);
}

public class Implem : IMyList
{
public void new Add (object value) {}
public void new Add (Control value) {}
}

Nije dozvoljeno rec new zato sto metoda Add (Control value) ne prikriva Add (object value) zbog razlicitih parametara i dolazi do polimorfizacije pa se na takav nacin ne moze rijesiti ovaj problem

Citat:
Ono sto je ovde nezgodno je sto C# ne dozvoljava non-public implementacije interfejsa. Medjutim, bas ta klasa koju pominjes ima Add implementiran kao private, zanimljivo...


Za ovo ne znam ali cinjenica je da ControlCollection a i druge klase koje se nalaze u sklopu .Net Framework-a imaju implementaciju interfejsa i njihovih metoda ali sa drukcijim tipovima parametara.

[Ovu poruku je menjao Sale_123 dana 05.07.2005. u 13:23 GMT+1]

[Ovu poruku je menjao Sale_123 dana 05.07.2005. u 14:03 GMT+1]
[ Sale_123 @ 05.07.2005. 13:06 ] @
Rijesio sam problem. Eksplicitnom implementacijom metode ta metoda postaje nevidljiva za sve instance te klase koja implementira interfejs.


[Ovu poruku je menjao Sale_123 dana 05.07.2005. u 14:14 GMT+1]