Interface (Generischer Typ Problem)



  • Hallo Gurus,

    ich hab eine Interface IService und ein Interface IProvider:

    Jede Klasse welche IService implementiert wird einer Klasse welche IProvider implementiert über generischen type zugeordnet. Jeder Service Bekommt eine Referenz des entsprechenden Providers. (Hintergrund: ich will services und zugehörige Provider über definierte Schnittstelle programmieren welche druch Typen gebunden sind.)

    //Service Interface welceh einem best. Provider Typ zugeordnet ist
    interface IService<TProvider>
        {
    
        }
    
    //Provider welcher druch Klasse typsiert wird, beinhaltet services mit dem entsprechend Type
        interface IProvider<TType> where TType  : IService<TType>
        {
            void Add(TType ser);
        }
    
    //ServiceA wird dem ProviderA zugeordnet
        class ServiceA : IService<ProviderA>
        {
            readonly IProvider<ProviderA> _pro = default(IProvider<ProviderA>);
            public ServiceA(IProvider<ProviderA> pro)
            {
                _pro = pro;
            }
        }
    //ProviderA wird definiert und beinhaltet nur Service A typen
    class ProviderA : IProvider<ServiceA>
        {
    
            List<ServiceA> list = new List<ServiceA>();
            public void Add(ServiceA ser)
            {
                list.Add(ser);
            }
    
        }
         }
    

    Nun kommen folgende Fehler, mit denen ich nix anfangen kann:(

    Fehler 1 Der Typ "TagLib.ProviderA" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine implizite Verweiskonvertierung von "TagLib.ProviderA" in "TagLib.IService<TagLib.ProviderA>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 22 39 TagLib

    Fehler 2 Der Typ "TagLib.ProviderA" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine implizite Verweiskonvertierung von "TagLib.ProviderA" in "TagLib.IService<TagLib.ProviderA>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 23 16 TagLib

    Fehler 3 Der Typ "TProvider" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine Boxing-Konvertierung oder Typparameterkonvertierung von "TProvider" in "TagLib.IService<TProvider>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 30 30 TagLib

    Fehler 4 Der Typ "TProvider" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine Boxing-Konvertierung oder Typparameterkonvertierung von "TProvider" in "TagLib.IService<TProvider>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 31 16 TagLib



  • So?

    public interface IProvider<T, U> where T: IService<U>
      {
      }
    
      public class ProviderA : IProvider<ServiceA, ProviderA>
      {
      }
    
      public class ServiceA : IService<ProviderA>
      {
      }
    


  • Das ist schonmal eine gute idee... Nun möchte ich aber zwischen den Interface und den Konkreten Service klassen eine Abstracte Klasse zwischen schachteln.. hab sowas gemacht:

    public interface IService<TProvider>
        {
        }
        public interface IProvider<T, U> where T : IService<U>
        {
            object ProviderInfo();
        }
    
        public class ProviderA : IProvider<ServiceA, ProviderA>
        {
            public object ProviderInfo(){throw new NotImplementedException(); }
        }
    
        public class ProviderB : IProvider<ServiceB, ProviderB>
        {
            public object ProviderInfo() { throw new NotImplementedException(); }
        }
    
        public abstract class AbstractService<TProvider,TService> : IService<TProvider>
        {
    
            public readonly IProvider<TService, TProvider> /*HIER*/_pro = default(IProvider<TService, TProvider>);
    
            public /*HIER*/AbstractService(IProvider<TService, TProvider> pro)
            {
                _pro = pro;
            }
        }
        public class ServiceB : AbstractService<ProviderB,ServiceB>
        {
            public ServiceB(ProviderB Pro)
                : base(Pro)
            {
            }
        }
        public class ServiceA : AbstractService<ProviderA, ServiceA>
        {
            public ServiceA(ProviderA Pro)
                : base(Pro)
            {
            }
        }
    

    Bei HIER Kommen 2 mal der gleiche Fehler welchen ich nich verstehe:

    Fehler 2 Der Typ "TService" kann nicht als Typparameter "T" im generischen Typ oder in der generischen Methode "TagLib.IProvider<T,U>" verwendet werden. Es ist keine Boxing-Konvertierung oder Typparameterkonvertierung von "TService" in "TagLib.IService<TProvider>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 28 56 TagLib


Anmelden zum Antworten