Bonjour à tous,
J'ai une classe parente 'Entite' exposant certaines méthodes génériques
ainsi que des méthodes dont je souhaite forcer l'implémentation par les
classes enfants.
J'ai donc fait usage de méthodes abstraites et utilisé les signatures
suivantes:
protected abstract string GetInformations();
Ce qui marche exactement comme je le souhaite.
Cependant, j'aimerais également ajouter des variables membres (string)
ou même des propriétés (si pas possible) statiques dont je peux par le
même mécanisme "forcer" l'implémentation par la classe enfant.
J'ai donc tenté d'écrire ceci:
public abstract static string Module;
Mais comme vous l'aurez deviné, c'est refusé (un membre statique ne
peut être déclaré comme override, virtual ou abstract).
Je sais que je peux déclarer une version dans la classe et ensuite utiliser
override dans la classe enfant mais l'IDE ne forcera pas le dévelopeur
à le faire.
Question: comment forcer l'implémentation de méthodes ou propriétés
statiques au sein de la classe enfant?
Merci d'avance pour vos propositions = )
.antoine
Bonjour à tous,
J'ai une classe parente 'Entite' exposant certaines méthodes génériques
ainsi que des méthodes dont je souhaite forcer l'implémentation par les
classes enfants.
J'ai donc fait usage de méthodes abstraites et utilisé les signatures
suivantes:
protected abstract string GetInformations();
Ce qui marche exactement comme je le souhaite.
Cependant, j'aimerais également ajouter des variables membres (string)
ou même des propriétés (si pas possible) statiques dont je peux par le
même mécanisme "forcer" l'implémentation par la classe enfant.
J'ai donc tenté d'écrire ceci:
public abstract static string Module;
Mais comme vous l'aurez deviné, c'est refusé (un membre statique ne
peut être déclaré comme override, virtual ou abstract).
Je sais que je peux déclarer une version dans la classe et ensuite utiliser
override dans la classe enfant mais l'IDE ne forcera pas le dévelopeur
à le faire.
Question: comment forcer l'implémentation de méthodes ou propriétés
statiques au sein de la classe enfant?
Merci d'avance pour vos propositions = )
.antoine
Bonjour à tous,
J'ai une classe parente 'Entite' exposant certaines méthodes génériques
ainsi que des méthodes dont je souhaite forcer l'implémentation par les
classes enfants.
J'ai donc fait usage de méthodes abstraites et utilisé les signatures
suivantes:
protected abstract string GetInformations();
Ce qui marche exactement comme je le souhaite.
Cependant, j'aimerais également ajouter des variables membres (string)
ou même des propriétés (si pas possible) statiques dont je peux par le
même mécanisme "forcer" l'implémentation par la classe enfant.
J'ai donc tenté d'écrire ceci:
public abstract static string Module;
Mais comme vous l'aurez deviné, c'est refusé (un membre statique ne
peut être déclaré comme override, virtual ou abstract).
Je sais que je peux déclarer une version dans la classe et ensuite utiliser
override dans la classe enfant mais l'IDE ne forcera pas le dévelopeur
à le faire.
Question: comment forcer l'implémentation de méthodes ou propriétés
statiques au sein de la classe enfant?
Merci d'avance pour vos propositions = )
.antoine
> Et les Interfaces tu y as pensé ?
Cela pourrait répondre à ton problème je suppose puisque une interface
définit des méthodes que les classes qui l'implémenteront devront utiliser.
> Et les Interfaces tu y as pensé ?
Cela pourrait répondre à ton problème je suppose puisque une interface
définit des méthodes que les classes qui l'implémenteront devront utiliser.
> Et les Interfaces tu y as pensé ?
Cela pourrait répondre à ton problème je suppose puisque une interface
définit des méthodes que les classes qui l'implémenteront devront utiliser.
Cependant, j'aimerais également ajouter des variables membres (string)
ou même des propriétés (si pas possible) statiques dont je peux par le
même mécanisme "forcer" l'implémentation par la classe enfant.
J'ai donc tenté d'écrire ceci:
public abstract static string Module;
Mais comme vous l'aurez deviné, c'est refusé (un membre statique ne
peut être déclaré comme override, virtual ou abstract).
Question: comment forcer l'implémentation de méthodes ou propriétés
statiques au sein de la classe enfant?
Cependant, j'aimerais également ajouter des variables membres (string)
ou même des propriétés (si pas possible) statiques dont je peux par le
même mécanisme "forcer" l'implémentation par la classe enfant.
J'ai donc tenté d'écrire ceci:
public abstract static string Module;
Mais comme vous l'aurez deviné, c'est refusé (un membre statique ne
peut être déclaré comme override, virtual ou abstract).
Question: comment forcer l'implémentation de méthodes ou propriétés
statiques au sein de la classe enfant?
Cependant, j'aimerais également ajouter des variables membres (string)
ou même des propriétés (si pas possible) statiques dont je peux par le
même mécanisme "forcer" l'implémentation par la classe enfant.
J'ai donc tenté d'écrire ceci:
public abstract static string Module;
Mais comme vous l'aurez deviné, c'est refusé (un membre statique ne
peut être déclaré comme override, virtual ou abstract).
Question: comment forcer l'implémentation de méthodes ou propriétés
statiques au sein de la classe enfant?
> L'héritage sert à manipuler des objets possédants des propriétés
communes.
Déclarons donc un objet de type A et utilisont la propriété commune à tous
les objets de type A :
public void MyMethod(A a) {
DoSomething(a.Module); //Ca n'a pas de sens car Module est static et donc
associé à un type pas à un objet.
}
Déclarer un membre static et abstract/virtual n'a donc pas de sens.
Si vous en avez besoin, c'est que vous avez à priori un problème de
conception (sauf si vous voulez utilisez des opérateurs qui sont
statiques,
mais c'est un autre débat).
Dans quelle situation estimez vous en avoir besoin ?
> L'héritage sert à manipuler des objets possédants des propriétés
communes.
Déclarons donc un objet de type A et utilisont la propriété commune à tous
les objets de type A :
public void MyMethod(A a) {
DoSomething(a.Module); //Ca n'a pas de sens car Module est static et donc
associé à un type pas à un objet.
}
Déclarer un membre static et abstract/virtual n'a donc pas de sens.
Si vous en avez besoin, c'est que vous avez à priori un problème de
conception (sauf si vous voulez utilisez des opérateurs qui sont
statiques,
mais c'est un autre débat).
Dans quelle situation estimez vous en avoir besoin ?
> L'héritage sert à manipuler des objets possédants des propriétés
communes.
Déclarons donc un objet de type A et utilisont la propriété commune à tous
les objets de type A :
public void MyMethod(A a) {
DoSomething(a.Module); //Ca n'a pas de sens car Module est static et donc
associé à un type pas à un objet.
}
Déclarer un membre static et abstract/virtual n'a donc pas de sens.
Si vous en avez besoin, c'est que vous avez à priori un problème de
conception (sauf si vous voulez utilisez des opérateurs qui sont
statiques,
mais c'est un autre débat).
Dans quelle situation estimez vous en avoir besoin ?
pour ce qui concerne son cas de figure, j'imagine le pire, mais suite à
notre reflexion comunne sur la genericité, je m'interroge... c'était
en smalltalk , je me souviens plus ?
pour ce qui concerne son cas de figure, j'imagine le pire, mais suite à
notre reflexion comunne sur la genericité, je m'interroge... c'était
en smalltalk , je me souviens plus ?
pour ce qui concerne son cas de figure, j'imagine le pire, mais suite à
notre reflexion comunne sur la genericité, je m'interroge... c'était
en smalltalk , je me souviens plus ?
> Dans quelle situation estimez vous en avoir besoin ?
> Dans quelle situation estimez vous en avoir besoin ?
> Dans quelle situation estimez vous en avoir besoin ?
J'ai des classes entité-relation encapsulant la persistance avec les
de la base de données.
Ex:
------------------------------------------------------
//création d'un nouveau compte
Compte c = new Compte();
c.Proprietaire = "moi";
c.DateCreation = DateTime.Now;
c.SoldeInitial = 2000;
c.Insert();
//recherche des comptes dont le solde initial est à 2000
ArrayList alAccounts = Compte.FindBySoldeInitial(2000);
foreach(Compte c in alAccounts)
{
//...
}
//recherche du compte de référence '1000-AA'
Compte c = Compte.FindByRef("1000-AA");
------------------------------------------------------
Comme vous pouvez le constater, les méthodes dites 'Finder Methods' (ici,
FindByRef et FindBySoldeInitial) sont à accès statique. Il ne serait
conceptuellement pas correct d'écrire ceci:
ArrayList alAccounts = new Compte().FindBySoldeInitial(2000);
Cette application ne devait à la base qu'être un "util" minimal est peu
Aujourd'hui mon boss veut en vendre une version améliorée et nous nous
retrouvons dessus à plusieurs développeurs.
Je souhaite contractualiser l'implémentation de classes entités et forçant
l'implémentation de deux Finders minimaux:
- FindByRef //retourne l'instance trouvée grâce à la valeur d'une
- FindAll() //retourne la collection de tous les éléments
en méthodes statiques..
Ni plus, ni moins. J'espère avoir clairement répondu à votre question = )
Si je comprends bien, votre classe Compte posséde un champ statique qui
Vous réinventez la roue : utilisez un dataset (de préférence fortement
J'ai des classes entité-relation encapsulant la persistance avec les
de la base de données.
Ex:
------------------------------------------------------
//création d'un nouveau compte
Compte c = new Compte();
c.Proprietaire = "moi";
c.DateCreation = DateTime.Now;
c.SoldeInitial = 2000;
c.Insert();
//recherche des comptes dont le solde initial est à 2000
ArrayList alAccounts = Compte.FindBySoldeInitial(2000);
foreach(Compte c in alAccounts)
{
//...
}
//recherche du compte de référence '1000-AA'
Compte c = Compte.FindByRef("1000-AA");
------------------------------------------------------
Comme vous pouvez le constater, les méthodes dites 'Finder Methods' (ici,
FindByRef et FindBySoldeInitial) sont à accès statique. Il ne serait
conceptuellement pas correct d'écrire ceci:
ArrayList alAccounts = new Compte().FindBySoldeInitial(2000);
Cette application ne devait à la base qu'être un "util" minimal est peu
Aujourd'hui mon boss veut en vendre une version améliorée et nous nous
retrouvons dessus à plusieurs développeurs.
Je souhaite contractualiser l'implémentation de classes entités et forçant
l'implémentation de deux Finders minimaux:
- FindByRef //retourne l'instance trouvée grâce à la valeur d'une
- FindAll() //retourne la collection de tous les éléments
en méthodes statiques..
Ni plus, ni moins. J'espère avoir clairement répondu à votre question = )
Si je comprends bien, votre classe Compte posséde un champ statique qui
Vous réinventez la roue : utilisez un dataset (de préférence fortement
J'ai des classes entité-relation encapsulant la persistance avec les
de la base de données.
Ex:
------------------------------------------------------
//création d'un nouveau compte
Compte c = new Compte();
c.Proprietaire = "moi";
c.DateCreation = DateTime.Now;
c.SoldeInitial = 2000;
c.Insert();
//recherche des comptes dont le solde initial est à 2000
ArrayList alAccounts = Compte.FindBySoldeInitial(2000);
foreach(Compte c in alAccounts)
{
//...
}
//recherche du compte de référence '1000-AA'
Compte c = Compte.FindByRef("1000-AA");
------------------------------------------------------
Comme vous pouvez le constater, les méthodes dites 'Finder Methods' (ici,
FindByRef et FindBySoldeInitial) sont à accès statique. Il ne serait
conceptuellement pas correct d'écrire ceci:
ArrayList alAccounts = new Compte().FindBySoldeInitial(2000);
Cette application ne devait à la base qu'être un "util" minimal est peu
Aujourd'hui mon boss veut en vendre une version améliorée et nous nous
retrouvons dessus à plusieurs développeurs.
Je souhaite contractualiser l'implémentation de classes entités et forçant
l'implémentation de deux Finders minimaux:
- FindByRef //retourne l'instance trouvée grâce à la valeur d'une
- FindAll() //retourne la collection de tous les éléments
en méthodes statiques..
Ni plus, ni moins. J'espère avoir clairement répondu à votre question = )
Si je comprends bien, votre classe Compte posséde un champ statique qui
Vous réinventez la roue : utilisez un dataset (de préférence fortement
> > Ni plus, ni moins. J'espère avoir clairement répondu à votre question = )
Oui et non. Je n'ai pas été assez précis : comment vous utiliseriez
l'héritage si il existait ? Donnez moi par exemple, la classe Finder de
base, les 2 finders filles et un code qui fonctionnerait si l'héritage
existait.
Sinon 2 remarques :
> Si je comprends bien, votre classe Compte posséde un champ statique qui
est une collection quelconque contenant l'ensemble des Compte ? Si c'est
bien ça, c'est une mauvaise idée : le jour où vous aurez besoin de 2
collections, vous ferez comment ? Séparez la collection des données.
> Vous réinventez la roue : utilisez un dataset (de préférence fortement
typé) : vous verrez : vous écrirez moins de code et vous aurez beaucoup
plus de fonctionnalités.
> > Ni plus, ni moins. J'espère avoir clairement répondu à votre question = )
Oui et non. Je n'ai pas été assez précis : comment vous utiliseriez
l'héritage si il existait ? Donnez moi par exemple, la classe Finder de
base, les 2 finders filles et un code qui fonctionnerait si l'héritage
existait.
Sinon 2 remarques :
> Si je comprends bien, votre classe Compte posséde un champ statique qui
est une collection quelconque contenant l'ensemble des Compte ? Si c'est
bien ça, c'est une mauvaise idée : le jour où vous aurez besoin de 2
collections, vous ferez comment ? Séparez la collection des données.
> Vous réinventez la roue : utilisez un dataset (de préférence fortement
typé) : vous verrez : vous écrirez moins de code et vous aurez beaucoup
plus de fonctionnalités.
> > Ni plus, ni moins. J'espère avoir clairement répondu à votre question = )
Oui et non. Je n'ai pas été assez précis : comment vous utiliseriez
l'héritage si il existait ? Donnez moi par exemple, la classe Finder de
base, les 2 finders filles et un code qui fonctionnerait si l'héritage
existait.
Sinon 2 remarques :
> Si je comprends bien, votre classe Compte posséde un champ statique qui
est une collection quelconque contenant l'ensemble des Compte ? Si c'est
bien ça, c'est une mauvaise idée : le jour où vous aurez besoin de 2
collections, vous ferez comment ? Séparez la collection des données.
> Vous réinventez la roue : utilisez un dataset (de préférence fortement
typé) : vous verrez : vous écrirez moins de code et vous aurez beaucoup
plus de fonctionnalités.
public interface IEntity
{
long Insert();
long Update();
long Delete();
static ArrayList FindAll();
static IEntity FindByRef(long aRef);
}
public class Client : IEntity
{
Sinon 2 remarques :
> Si je comprends bien, votre classe Compte posséde un champ statique qui
est une collection quelconque contenant l'ensemble des Compte ? Si c'est
bien ça, c'est une mauvaise idée : le jour où vous aurez besoin de 2
collections, vous ferez comment ? Séparez la collection des données.
> Vous réinventez la roue : utilisez un dataset (de préférence fortement
typé) : vous verrez : vous écrirez moins de code et vous aurez beaucoup
plus de fonctionnalités.
Oui et non, un exemple court donne ceci (je fais omission de tous les
contrôles
d'integrité, propriétés à la place de membres publics, blocs try/catch,
etc pour
augmenter la lisibilité):
Toujours réveillé ?
Bref, première remarque que l'on serait tenté de me faire (et on me l'a
déjà faite):
pourquoi ne pas simplement rendre le Finder principal public et ne pas
avoir
ainsi à implémenter tous les autres Finders ?
Ce choix découle de 2 besoins:
1) les librairies sont utilisées par d'autres développeurs possédant
peu d'expérience
2) nous avons un système de spécifications inspiré de l'extreme
programming,
des petites cartes cartonnées sur lequel figurent les cas
d'utilisation.
Les méthodes découlant du cas d'utilisation sont standardisées: si le
carton dit
"Find All members from a same domain", les deux développeurs chargés de
créer les librairies savent qu'il y aura un finder du genre
FindAllByDomain(), etc.
En ce qui concerne votre proposition du dataset spécialisé.... j'y suis un
peu
réfractaire et là c'est un choix plutôt politique et personnel. Un peu
comme je choisis
d'utiliser des datareaders alors que d'autres développeurs très dépendants
du
designer de VS ne savent même pas ce que c'est après une année de
développement
orienté Dotnet.
public interface IEntity
{
long Insert();
long Update();
long Delete();
static ArrayList FindAll();
static IEntity FindByRef(long aRef);
}
public class Client : IEntity
{
Sinon 2 remarques :
> Si je comprends bien, votre classe Compte posséde un champ statique qui
est une collection quelconque contenant l'ensemble des Compte ? Si c'est
bien ça, c'est une mauvaise idée : le jour où vous aurez besoin de 2
collections, vous ferez comment ? Séparez la collection des données.
> Vous réinventez la roue : utilisez un dataset (de préférence fortement
typé) : vous verrez : vous écrirez moins de code et vous aurez beaucoup
plus de fonctionnalités.
Oui et non, un exemple court donne ceci (je fais omission de tous les
contrôles
d'integrité, propriétés à la place de membres publics, blocs try/catch,
etc pour
augmenter la lisibilité):
Toujours réveillé ?
Bref, première remarque que l'on serait tenté de me faire (et on me l'a
déjà faite):
pourquoi ne pas simplement rendre le Finder principal public et ne pas
avoir
ainsi à implémenter tous les autres Finders ?
Ce choix découle de 2 besoins:
1) les librairies sont utilisées par d'autres développeurs possédant
peu d'expérience
2) nous avons un système de spécifications inspiré de l'extreme
programming,
des petites cartes cartonnées sur lequel figurent les cas
d'utilisation.
Les méthodes découlant du cas d'utilisation sont standardisées: si le
carton dit
"Find All members from a same domain", les deux développeurs chargés de
créer les librairies savent qu'il y aura un finder du genre
FindAllByDomain(), etc.
En ce qui concerne votre proposition du dataset spécialisé.... j'y suis un
peu
réfractaire et là c'est un choix plutôt politique et personnel. Un peu
comme je choisis
d'utiliser des datareaders alors que d'autres développeurs très dépendants
du
designer de VS ne savent même pas ce que c'est après une année de
développement
orienté Dotnet.
public interface IEntity
{
long Insert();
long Update();
long Delete();
static ArrayList FindAll();
static IEntity FindByRef(long aRef);
}
public class Client : IEntity
{
Sinon 2 remarques :
> Si je comprends bien, votre classe Compte posséde un champ statique qui
est une collection quelconque contenant l'ensemble des Compte ? Si c'est
bien ça, c'est une mauvaise idée : le jour où vous aurez besoin de 2
collections, vous ferez comment ? Séparez la collection des données.
> Vous réinventez la roue : utilisez un dataset (de préférence fortement
typé) : vous verrez : vous écrirez moins de code et vous aurez beaucoup
plus de fonctionnalités.
Oui et non, un exemple court donne ceci (je fais omission de tous les
contrôles
d'integrité, propriétés à la place de membres publics, blocs try/catch,
etc pour
augmenter la lisibilité):
Toujours réveillé ?
Bref, première remarque que l'on serait tenté de me faire (et on me l'a
déjà faite):
pourquoi ne pas simplement rendre le Finder principal public et ne pas
avoir
ainsi à implémenter tous les autres Finders ?
Ce choix découle de 2 besoins:
1) les librairies sont utilisées par d'autres développeurs possédant
peu d'expérience
2) nous avons un système de spécifications inspiré de l'extreme
programming,
des petites cartes cartonnées sur lequel figurent les cas
d'utilisation.
Les méthodes découlant du cas d'utilisation sont standardisées: si le
carton dit
"Find All members from a same domain", les deux développeurs chargés de
créer les librairies savent qu'il y aura un finder du genre
FindAllByDomain(), etc.
En ce qui concerne votre proposition du dataset spécialisé.... j'y suis un
peu
réfractaire et là c'est un choix plutôt politique et personnel. Un peu
comme je choisis
d'utiliser des datareaders alors que d'autres développeurs très dépendants
du
designer de VS ne savent même pas ce que c'est après une année de
développement
orienté Dotnet.