Ne pas Comprendre l'Instanciation d'Objets en C#
Ce post va à une lacune dans ma compréhension de classes C# et pourquoi ils sont préférables à des fonctions statiques.
Je suis en train d'essayer d'obtenir une Liste d'objets. Chaque objet de la liste représente un enregistrement dans une table. Ce serait facile de le faire dans une fonction statique.
À l'aide d'une classe, j'ai été capable de le faire comme suit:
Appel de la routine:
ListOfBusinesses l = new ListOfBusinesses ();
List<Business> b = l.listBusinesses();
Les classes:
public class Business
{
public string Bupk { get; set; }
public string Bu_name { get; set; }
}
public class ListOfBusinesses
{
public List<Business> listBusinesses()
{
List<Business> businesses = new List<Business>();
businesses.Add(new Business("1", "Business Name 1"));
businesses.Add(new Business("2", "Business Name 2"));
return businesses;
}
}
Pourrais-je ne pas réécrire la classe de sorte que ce qui peut être fait avec une seule ligne:
ListOfBusinesses l = new ListOfBusinesses();
Il me semble que la ListofBusinesses classe ci-dessus n'est rien mais une fonction statique enroulé dans une classe qui n'a pas de propriétés et n'est là que pour le plaisir d'avoir une classe.
J'ai essayé:
public class ListOfBusinesses
{
List<Business> businesses;
public List<Business> ListOfBusinesses()
{
List<Business> businesses = new List<Business>();
businesses.Add(new Business("1", "Business Name 1"));
businesses.Add(new Business("2", "Business Name 2"));
return businesses;
}
}
Mais a reçu l'erreur de compilation "les noms des membres ne peut pas être le même qu'il y joignant type". Par exemple, j'ai essayé d'utiliser un constructeur, mais je suis en manque de quelque chose.
Toute aide serait de m'éclairer dans une zone que j'ai mal pendant un certain temps.
Mike Thomas
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez mélangé les concepts d'une fonction statique, un constructeur et une méthode de fabrique.
Fonction Statique
Définition
C'est une méthode qui n'a pas accès (et n'est pas associé) d'une
this
instance d'une classe.Exemple
Utilisation
Appel d'une méthode statique avec le nom de la classe, et non une instance de la classe.
Constructeur: C'est une méthode qui crée la
this
instance d'une classe. Il n'a pas de valeur de retour et est appelée lorsqu'un objet est instancié.Exemple
Utilisation
Créer une nouvelle instance de l'objet.
Usine Méthode
Définition
C'est une méthode qui crée une instance d'un objet, instancie une certaine manière, et renvoie une référence à elle.
Exemple
Utilisation
Appeler la méthode de fabrique au lieu de création d'un nouvel objet.
Deux choses à noter:
Vous déclarez une
businesses
champ, mais de procéder à instancier un autre variable appeléebusinesses
dans votreListOfBusinesses()
méthode et de le retourner. Rien ne se passera pour lebusinesses
champ. Soyez prudent avec la variable de portée.Vous ne pouvez pas avoir un membre (un champ, une propriété ou une méthode) avec le même nom que la classe. C'est réservé pour le constructeur, qui n'a pas de type de retour (voir ci-dessus). C'est pourquoi vous obtenez l'erreur de compilation.
OriginalL'auteur
Sûr. Au lieu de l'encapsulation
List<Business>
de la prolonger. Ensuite vous avez juste à ajouter des choses dans le constructeur.Pour l'utiliser:
Il a regardé comme Mike voulait une classe qui lui a donné une liste par défaut avec un ensemble de valeurs déjà ajouté. Il y a deux solutions: utiliser une usine, ou d'étendre la liste par défaut. J'ai l'impression qu'il veut faire plus que d'en ajouter un couple de valeurs par défaut - peut-être ajouter un couple de méthodes ou de quelque chose - qui est pourquoi il s'est encapsulé dans la première place. Je pense simplement qu'il serait plus facile de l'étendre.
OriginalL'auteur
Instanciation d'objet est fondamentalement la même pour tous les langages à objets.
L'utilisation de classes plutôt que des fonctions statiques permet beaucoup plus de souplesse et, finalement, moins de codage, en particulier lorsque de garder la trace de nombreux éléments similaires.
Pense que des livres et des bibliothèques.
Si vous avez le livre comme un objet de la classe puis vous pouvez l'instancier pour créer des lots de livres et de les stocker dans votre bibliothèque. Chaque livre que vous avez instatiated est unique. Si vous n'avez fait aucun changement à chaque instancié livre semble être une copie de l'original (bien qu'à un faible niveau de chaque livre possède un numéro de série unique). Il a la même couverture, nombre de pages et de contenu, MAIS vous pouvez facilement écrire votre nom en un seul exemplaire ainsi qu'il soit différent du reste.
Si vous le livre statique alors, bien que vous ne pouvez pas créer des copies individuelles, au lieu que vous recherchez dans le même livre, mais à partir de différents points de vue. Si vous écrivez votre nom puis votre nom apparaît dans chaque vue de la livre.
Je ne vais pas poster tout le code que tandis que j'ai été taper beaucoup d'autres ont publié des exemples de code pour votre business objects.
OriginalL'auteur
Vous êtes à la recherche d'une méthode de fabrique, au lieu d'un constructeur.
OriginalL'auteur
Votre erreur du compilateur est parce que votre nom de la classe est "ListOfBusinesses" et le nom de la méthode est également "ListOfBusinesses". Ce serait bien si c'était un constructeur, mais puisque vous avez un type de retour sur elle, C# est penser que l'on entend être une méthode plutôt qu'un constructeur.
Comme pour obtenir votre liste d'entreprises, pourquoi ne pas créer une classe comme ceci:
Puis de l'utiliser:
OriginalL'auteur
Que vous essayez de revenir à quelque chose de différent de la classe dans le constructeur
Vous ne pouvez pas spécifier un type de retour dans un constructeur, vous avez besoin de:
Comme Mike Thomas a dit, vous devez utiliser une usine à la place si c'est ce que vous voulez.
OriginalL'auteur
Le problème est que vous utilisez un mot réservé (nouveau) utilisée pour appeler le constructeur de de la classe.
La sémantique du constructeur est de retourner une instance de la classe qui est en train d'être créé, et il suit la règle de ne pas avoir de valeur de retour et ayant le même nom de la classe.
Si ce n'était pas de cette façon, alors, si vous n'avez aucune
new MyObject
... comment vous (ou le compilateur qu'à y être) censé connaître le type de retour?OriginalL'auteur
En règle générale, vous ne pouvez pas créer votre ListOfBusinesses classe, sauf ListOfBusinesses a certaines propriétés qui ne sont pas disponibles dans une Liste<Business>. La façon la plus simple de ce traitement est une méthode statique de la classe Affaires, comme suit:
Alors que c'est le moyen simple, le résultat final de descendre cette route est à refactoriser cette méthode de la classe Affaires et dans une fabrique d'objet, souvent par le biais d'un ORM comme NHibernate ou le Château de Windsor.
OriginalL'auteur
Si je ne me trompe pas, vous voulez accéder à une base de données et récupérer une liste d'objets avec une seule ligne téléphonique.
Tout d'abord vous avez besoin d'un DAO classe qui encapsule le db d'accès et d'exposer une méthode de la Liste.
À l'intérieur de la DAO, vous pouvez utiliser NHibernate, Linq2XXX ou ce que vous voulez (exemple)
votre code client pourrait simplement appeler
retour d'un IQueryable au lieu d'une Liste peut vous aider si vous êtes Linq activé.
OriginalL'auteur
Comme les gens l'ont dit avant - ta syntaxe n'est pas bonne ici.
ListOfBusiness()
est un constructeur et ne pas renvoyer explicitement un objet. Au lieu de cela, il fonctionne sur une nouvelle instance deListOfBusiness
et de prendre soin de toute la création nécessaire.Que dit - si votre méthode pour créer le
List<Business>
est simple, il n'y a absolument aucune raison pour que cela devrait faire partie d'une méthode statique. Vous pouvez même définir une méthode d'extension sur la Liste qui prend une liste vide et le remplit. Ceci est appelé le modèle de Fabrique, dans lequel une méthode ou d'une instance d'un objet prend en charge la création de nouvelles instances.L'endroit où vous voulez réfléchir à l'extension de
ListOfBusiness
dans un instancié de la classe est si il y a des propriétés ou de l'état qui doit être suivi. SI leList<Business>
change à chaque fois qu'elle est appelée, ou si vous avez besoin d'un endroit pour ajouter de nouvelles Entreprises, de laListOfBusiness
classe peut être utile pour cela.OriginalL'auteur