2015-07-03 19 views
6

Co to znaczy dekorować klasę lub parametr?
Jaki jest cel i kiedy powinienem to zrobić?Co to znaczy udekorować klasę lub parametr?

Linki do zasobów i odpowiedzi bezpośrednie są mile widziane.

Dzięki.

+1

Szukam tego? http://www.codeproject.com/Articles/479635/UnderstandingplusandplusImplementingplusDecoratorp –

+1

Możesz dekorować klasy i członków klasy atrybutami. Zasadniczo te atrybuty są kolejnymi klasami pochodnymi klasy System.Attribute, które dostarczają dodatkowych informacji. Więcej informacji można znaleźć tutaj: https: // msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx – Fabjan

+2

W języku C# może to oznaczać użycie Atrybutu lub wzoru dekoratora. Przypuszczam, że masz na myśli atrybuty, ponieważ dotyczą one zarówno klas, jak i parametrów. – nozzleman

Odpowiedz

3

Dekorator był jednym z oryginalnych 26 wzorów opisanych w książce Gang of Four "Design Patterns". Opisują to dobrze here.

Podsumowanie:

Dekorator: Dodaj dodatkowe funkcje do klasy w czasie wykonywania gdzie subclassing powodowałby wykładniczym wzrostem nowych klas

wzory język agnostykiem. Są to opisy rozwiązań typowych problemów w programowaniu obiektowym. Możliwe jest nawet, nawet przedyskutowanie ich bez odniesienia do konkretnego języka. Przykłady w oryginalnej książce zostały napisane w C++ i Smalltalk. Ani Java, ani C# nie istniały, gdy książka została po raz pierwszy opublikowana w 1995 roku.

3

Dodanie dekoratora w języku C# przypomina dodawanie właściwości do klasy/metody. Zostanie dołączony atrybut.

Jeśli piszesz testy jednostkowe Poznasz proste dekorator TestMethod tak:

[TestMethod] 
public void TestMethod1() 
{ 
} 

Ramy użyje dekoratorów aby sprawdzić co badanie metody są w zestawie testowym.

Można sprawdzić na atrybucie here

Jest inna miło przeczytać artykuł o Writing Custom Attributes

Dekoratorzy nie ograniczają się do „[]” postaci dekoratorów. Istnieje również wzorzec projektowy, o którym już wcześniej wspominali inni.

1

Dekorowanie klasy oznacza dodanie funkcjonalności do istniejącej klasy. Na przykład masz klasę SingingPerson, która ma talent do śpiewania.

public class SingingPerson 
{ 
    public string Talent = "I can sing"; 
    public string DoTalent() 
    { 
     return Talent; 
    } 
} 

Później zdecydowałeś, że klasa SingingPerson powinny również być w stanie tańczyć, ale nie chcę, aby zmienić istniejące struktury klasowej. To co robisz, dekorujesz klasę SingingPerson, tworząc inną klasę, która zawiera dodatkową funkcjonalność. Ta nowa klasa, którą będziesz tworzyć, bierze obiekt SinginPerson.

public class SingingAndDancingPerson { 
    SingingPerson person; 
    public string Talent { get; set; } 
    public SingingAndDancingPerson(SingingPerson person) 
    { 
     this.person = person; 
    } 

    public string DoTalent() 
    { 
     this.Talent = person.Talent; 
     this.Talent += " and dance"; 
     return this.Talent; 
    } 
} 

Podczas próby utworzenia instancji tych klas wyjście będzie następujący:

SingingPerson person1 = new SingingPerson(); 
     Console.WriteLine("Person 1: " + person1.DoTalent()); 
     SingingAndDancingPerson person2 = new SingingAndDancingPerson(person1); 
     Console.WriteLine("Person 2: " + person2.DoTalent()); 
     Console.ReadLine(); 
+0

Ale to także oznacza pod-klasę __not__, nie? – TaW

+0

@TaW co masz na myśli przez "nie podklasy"? – jmc