2010-09-30 6 views
-2

un corps pourrait me expliquer l'abstraction et de l'interface asp.net, C# en prenant un exemple apprpriate ... pleasse je ne comprends pas pour longtempset explication l'interface

+1

Cette question est beaucoup trop large, et pourquoi cette question concerne-t-elle particulièrement asp.net? –

+0

On dirait que vous êtes nouveau sur OOP. Jetez un oeil ici: http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx – Charles

Répondre

3

Je trouve souvent l'exemple suivant tout à fait éclairante Quand il s'agit d'expliquer ceci:

Avertissement: les exemples de code sont écrits directement dans le texte, et peuvent contenir des erreurs que j'ai surveillées. S'il vous plaît laissez-moi savoir si vous trouvez de telles erreurs.

Disons que vous avez une base de données avec une table de clients, et dans votre code que vous avez une classe de client:

class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Afin de fournir un mécanisme pour obtenir des données clients à partir de la base de données, vous devez écris un cours en faisant ça. Cela peut être placé dans quelque chose appelé un référentiel . Maintenant, nous ne voulons pas que notre code dépende trop de la base de données exacte que nous utilisons. Ce pourrait être un serveur SQL, ce pourrait être un fichier texte. Nous voulons donc une couche d'abstraction protégeant le code de cette connaissance. Tout ce que nous devons savoir est ce qu'un tel dépôt ressemble à:

public interface ICustomerRepository 
{ 
    Customer GetCustomer(int id); 
    IEnumerable<Customer> FindCustomers(string beginningOfName); 
} 

Nous pouvons maintenant mettre en œuvre cette interface pour le stockage de données que nous utilisons:

public class SqlServerCustomerRepository : ICustomerRepository 
{ 
    public Customer GetCustomer(int id) 
    { 
     using(SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      // code to fetch data and populate Customer objects go here 
     } 
    } 
    // implementations of other members of ICustomerRepository 
    // left out to keep code short. Just imagine they are here :) 
} 

Enfin, lorsque l'on veut utiliser ce code , nous pouvons avoir une usine à créer la mise en œuvre concrète ICustomerRepository à utiliser:

public static class RepositoryFactory 
{ 
    public static ICustomerRepository CreateCustomerRepository() 
    { 
     return new SqlServerCustomerRepository(); 
    } 
} 

... et dans notre code où nous avons besoin des données:

ICustomerRepository repository = RepositoryFactory.CreateCustomerRepository(); 
IEnumerable<Customer> customers = repository.FindCustomers("A"); 

De cette façon, il n'y a pas de couplage fort entre le code consommation et le type particulier de référentiel utilisé (sauf dans la méthode de fabrication, mais qui est le seul et unique lieu où cette connaissance existe) . Cela facilite le remplacement de l'implémentation concrète du référentiel. Ceci est également utile pour les tests, où vous pouvez facilement créer un référentiel simulé renvoyant des résultats codés en dur pour une entrée donnée, de sorte que vous puissiez tester le code qui a besoin de données du référentiel.

+0

monsieur quoi de neuf IEnumerable ici, semble difficile de me comprendre s'il vous plaît élaborer un mème sur ce .. je suis novice – NoviceToDotNet

+0

@NovicetoDotNet: 'IEnumerable ' est une interface qui est implémentée par pratiquement tous les types de liste (y compris les tableaux) dans .NET. Fondamentalement, ce qu'il fait, c'est qu'il vous permet de faire une boucle sur les éléments qu'il contient en utilisant une boucle 'foreach', et c'est aussi le type autour de laquelle beaucoup de fonctionnalités LINQ est construit. –

1

Les classes abstraites et les interfaces ne sont pas strictement techniques asp.net, elles sont un concept OOP.

Interface

Une interface est comme une classe, mais toutes les méthodes et propriétés sont abstraites. Une interface ne peut pas être instanciée comme une classe abstraite. Toutes les méthodes et propriétés définies dans Interface sont par défaut public et abstrait. L'interface fait généralement référence à une abstraction qu'une entité fournit de lui-même à l'extérieur. L'interface peut aider à séparer les méthodes de communication externe et interne sans affecter la façon dont les entités externes interagissent avec le type. Exemple: Si vous avez interface IDoSomething { void Do(); } La classe qui implémente l'interface doit fournir un corps pour la méthode Do(), par ex.L'avantage de ceci est quand vous faites quelque chose qui n'a besoin que de la méthode Do que vous passez l'interface et non la classe.

public static void SomeMethod(IDoSomething obj) { obj.Do(); } Maintenant SomeMethod(IDoSomething obj) fonctionnera avec une classe qui implémente IDoSomething

classe abstraite

Une classe abstraite est une classe avec au moins une méthode définie comme abstraite. Ce type de classe ne peut pas être instancié. Une classe abstraite peut avoir une ou plusieurs méthodes et propriétés abstraites et d'autres méthodes et propriétés comme les classes normales.

L'idée est la même, mais en classe abstraite, vous pouvez avoir des méthodes avec une logique implémentée, des champs, etc.

0

Abstraction

L'abstraction est le processus de cacher la façon dont l'objet fonctionne, et son seul montrant les informations de l'objet de la façon dont nous pouvons le comprendre. Signifie qu'il représente les détails essentiels sans montrer les détails du sol. Nous mettons toutes les variables et la méthode dans une classe qui sont nécessaires.

Par exemple: employé et patient.

Société intéressé à remplir au sujet des détails de l'employé comme nom, adresse, Qualification, date de naissance, âge, Mobile, marques, expérience etc

Hôpital intéressé à remplir au sujet des détails sur le patient comme le nom, date de naissance, taille, poids, Âge, adresse, mobile, groupe sanguin etc.

La société et l'hôpital intéressés à remplir certains champs communs comme le nom, l'âge, la date de naissance, l'adresse, le mobile, etc. Nous pouvons donc créer une classe qui consiste en chose commune appelée classe abstraite. Cette classe ne sera pas complète mais pourra hériter d'une autre classe.

Résumé vs Interface Vous ne pouvez pas créer un objet de classe abstraite, mais vous pouvez en faire des dérivations. Une classe abstraite peut contenir des méthodes abstraites ou des méthodes non abstraites. Les membres abstraits n'ont aucune implémentation dans la classe abstraite, mais la même chose doit être fournie dans sa classe dérivée.

Une classe abstraite peut avoir des membres abstraits ainsi que des membres non abstraits. Mais dans une interface tous les membres sont implicitement abstraits et tous les membres de l'interface doivent passer à sa classe dérivée.

La définition d'une classe abstraite avec tous les membres abstraits est similaire à la définition d'une interface. Nous pouvons dire qu'une interface est une classe abstraite avec tous les membres abstraits Les classes peuvent hériter d'une seule classe de base, donc si vous voulez utiliser des classes abstraites pour fournir un polymorphisme à un groupe de classes, elles doivent toutes hériter de cette classe. Les classes abstraites peuvent également fournir des membres déjà implémentés. Par conséquent, vous pouvez assurer une certaine quantité de fonctionnalités identiques avec une classe abstraite, mais pas avec une interface.

Voici quelques recommandations pour vous aider à décider d'utiliser une interface ou une classe abstraite pour fournir un polymorphisme à vos composants.

1).Si vous prévoyez de créer plusieurs versions de votre composant, créez une classe abstraite. Les classes abstraites offrent un moyen simple et facile de mettre à jour vos composants. En mettant à jour la classe de base, toutes les classes héritières sont automatiquement mises à jour avec la modification. D'un autre côté, les interfaces ne peuvent pas être modifiées une fois créées. Si une nouvelle version d'une interface est requise, vous devez créer une toute nouvelle interface.

2). Si la fonctionnalité que vous créez sera utile sur un large éventail d'objets disparates, utilisez une interface. Les classes abstraites doivent être utilisées principalement pour les objets étroitement liés, tandis que les interfaces sont les mieux adaptées pour fournir des fonctionnalités communes à des classes non apparentées.

3). Si vous concevez de petites fonctionnalités concises, utilisez des interfaces. Si vous concevez de grandes unités fonctionnelles, utilisez une classe abstraite.

4). Si vous souhaitez fournir une fonctionnalité commune implémentée parmi toutes les implémentations de votre composant, utilisez une classe abstraite. Les classes abstraites vous permettent d'implémenter partiellement votre classe, tandis que les interfaces ne contiennent aucune implémentation pour les membres.