Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

interface generic

4 réponses
Avatar
Sylfelin
Bonjour,

Dans un objet COM d'un éditeur (sans le source) j'ai plusieurs versions
d'un objet. ObjetApp1 et ObjetApp2.

ObjetApp2 est une copie ObjetApp1 mais qui implémente des méthodes et
propriétées supplémentaires.

Je voudrais pouvoir écrire une class générique. J'essaye le code
ci-dessous mais évidement ça ne compile pas à cause des déclarations
dans les if.

Y a t'il une solution pour m'en sortir ?

Merci


class GenericObjetApp<T>
{
public T myObjetApp
}

class Program
{
static void Main(string[] args)
{
string version = "2";

if (version == "1")
GenericObjetApp<ObjetApp1> app=new GenericObjetApp<ObjetApp1>();

if (version == "2")
GenericObjetApp<ObjetApp2> app=new GenericObjetApp<ObjetApp2>();

app.myObjetApp.Close();

}
}

--

--------------------------
Merci
Sylfelin

4 réponses

Avatar
thierry.bip
Hello,

Je suppose que ton ObjetApp1 hérite d'une interface I1 et que ton ObjetApp2
hérite d'une interface I2, avec,
- I2 qui dérive aussi de I1
- ou ObjetApp2 implémen te aussi l'interface I1 (le plus souvent le cas
en COM)
Si c'est ça.. T'as tout gagné ! même pas besoin de faire une classe
générique ;o)

Il suffit de déclarer ton objet de type I1 (si I1 est suffisant pour faire
ce que tu veux)

class Program
{
static void Main(string[] args)
{
string version = "2";


IObjetAPP1 app;

if (version == "1")
app = new ObjetApp1();

if (version == "2")
app = new ObjetApp2();

app.Close();

}
}



Pour info, pour que ta classe générique puisse compiler, il faut que tu
précise de quelle interface (ou objet) et ton type T, pour qu'à la
compilation, il puisse vérifier que ta méthode Close() existe bien.

ex : class GenericObjetApp<T> where T : I1



"Sylfelin" a écrit dans le message de
news:
Bonjour,

Dans un objet COM d'un éditeur (sans le source) j'ai plusieurs versions
d'un objet. ObjetApp1 et ObjetApp2.

ObjetApp2 est une copie ObjetApp1 mais qui implémente des méthodes et
propriétées supplémentaires.

Je voudrais pouvoir écrire une class générique. J'essaye le code
ci-dessous mais évidement ça ne compile pas à cause des déclarations dans
les if.

Y a t'il une solution pour m'en sortir ?

Merci


class GenericObjetApp<T>
{
public T myObjetApp
}

class Program
{
static void Main(string[] args)
{
string version = "2";

if (version == "1")
GenericObjetApp<ObjetApp1> app=new GenericObjetApp<ObjetApp1>();

if (version == "2")
GenericObjetApp<ObjetApp2> app=new GenericObjetApp<ObjetApp2>();

app.myObjetApp.Close();

}
}

--

--------------------------
Merci
Sylfelin




Avatar
Sylfelin
>
Je suppose que ton ObjetApp1 hérite d'une interface I1 et que ton ObjetApp2
hérite d'une interface I2, avec,
- I2 qui dérive aussi de I1
- ou ObjetApp2 implémen te aussi l'interface I1 (le plus souvent le cas
en COM)
Si c'est ça.. T'as tout gagné ! même pas besoin de faire une classe générique
;o)




Malheureusement non. J'ai demandé au service dév de cete société et il
ont fait une recopie.

I1 est I1 et I2 de dérive pas de I1 c'est une recopie.

--

--------------------------
Merci
Sylfelin
Avatar
thierry.bip
Ils sont pas cool les développeurs de cette société :o(
Le "truc", c'est que même en utilisant les génériques, il faut que tes
classes d'implémentation aient des choses en commun (interface) sinon, ca
sera pas possible -> Il faut que la classe de base implémente les
méthodes/propriétés que tu comptes utiliser

Perso, je ne vois que la "reflexion" pour t'en sortir, puisqu'ils ont que
des noms de méthodes ou propriétés en commun.

Ci-dessous une classe "façade" qui utilise la réflexion
Si tes méthodes on des paramètres, il faudra compléter la classe (j'ai juste
implémenter l'appel à une méthode sans paramètre et aux propriétés)

Pour l'utiliser :

Facade facade = new Facade(ObjetApp1);
facade.Run("Open");


public class Facade
{
private object mObject;
private System.Type mType;

public Facade(object obj)
{
mObject = obj;
mType = mObject.GetType();
}

void Run(string methodname)
{
var mi = mType.GetMethod(methodname);
if (mi != null)
{
mi.Invoke(mObject, null);
}
}

public object GetValue(string propertyname)
{
var mi = mType.GetProperty(propertyname);
if (mi != null)
{
return mi.GetGetMethod().Invoke(mObject, null);
}

return null;
}

public void SetValue(string propertyname, object value)
{
var mi = mType.GetProperty(propertyname);
if (mi != null)
{
mi.GetSetMethod().Invoke(mObject, new object[1] { value });
}
}
}








"Sylfelin" a écrit dans le message de
news:
>
Je suppose que ton ObjetApp1 hérite d'une interface I1 et que ton
ObjetApp2 hérite d'une interface I2, avec,
- I2 qui dérive aussi de I1
- ou ObjetApp2 implémen te aussi l'interface I1 (le plus souvent le
cas en COM)
Si c'est ça.. T'as tout gagné ! même pas besoin de faire une classe
générique ;o)




Malheureusement non. J'ai demandé au service dév de cete société et il ont
fait une recopie.

I1 est I1 et I2 de dérive pas de I1 c'est une recopie.

--

--------------------------
Merci
Sylfelin




Avatar
Sylfelin
thierry.bip a écrit :
Ils sont pas cool les développeurs de cette société :o(
Le "truc", c'est que même en utilisant les génériques, il faut que tes
classes d'implémentation aient des choses en commun (interface) sinon, ca
sera pas possible -> Il faut que la classe de base implémente les
méthodes/propriétés que tu comptes utiliser

Perso, je ne vois que la "reflexion" pour t'en sortir, puisqu'ils ont que des
noms de méthodes ou propriétés en commun.




Très intéréssant. Je vais creuser.

Merci

--

--------------------------
Merci
Sylfelin