Recentemente ho letto di attributi e riflessioni e ho pensato che sarebbe stato un buon metodo per includere i metadati nel mio programma. Ho questa classe astratta e volevo che tutte le classi ereditassero da essa per dichiarare con la classe qualche attributo, dal momento che volevo creare componenti personalizzati (quelle classi derivate) per il mio programma e volevo leggere i metadati di queste classi su runtime. Tuttavia, tutte le classi derivate devono dichiarare esplicitamente l'attributo in cui memorizzo i metadati. Quindi, come posso forzare una dichiarazione di attributo nelle classi derivate? Grazie.Dichiarazione di attributo di forza nelle classi derivate
risposta
Definire la classe di attributo a sé stesso ha un attributo AttributeUsageAttribute
dove la proprietà Inherited
è true
.
o non, dato che è il default ...
obiettivi derivati (cioè le classi se l'attributo è su una classe, metodi, se si tratta di un metodo, etc.) sarà poi ereditare il attributo senza dichiarazione esplicita.
Se per "forza" si intende "imposizione del tempo di compilazione": non è possibile.
Come ha detto Daniel, non è possibile applicare gli attributi in fase di compilazione.
Ma se si desidera leggere i dati in fase di runtime, perché preoccuparsi di attributi e riflessioni? È possibile creare un metodo astratto nella classe astratta:
abstract class Base
{
public abstract string Metadata();
}
class Derived1 : Base
{
public override string Metadata()
{
return "Metadata for Derived1";
}
}
class Derived2 : Base // won't compile, since Metadata has not been provided
{
}
Il comportamento è leggermente diverso, ovviamente. Con questa opzione, è necessario un riferimento a un'istanza della classe derivata anziché solo le informazioni sul tipo stesso. D'altra parte, evita la riflessione.
Come dice Daniel, non è possibile forzare in fase di compilazione. È possibile aggiungere gli attributi al genitore astratto e prelevarli.
Un'altra opzione consiste nell'aggiungere un metodo per verificare l'esistenza dell'attrributo nella classe padre e generare un'eccezione se non presente. Chiamalo con metodi appropriati.
- 1. Estendere enum nelle classi derivate
- 2. Come disabilitare il designer nelle classi derivate nelle generazioni successive
- 3. Metodi pubblici extra nelle classi derivate?
- 4. Applicazione dell'implementazione di eventi nelle classi astratte derivate
- 5. Sovrascrivere le costanti nelle classi derivate in C#
- 6. Riflettere classi derivate in C#
- 7. Copia C++ di due classi derivate
- 8. C# - serializzazione XML di classi derivate
- 9. Inoltra dichiarazione di classi?
- 10. Modelli C++ e classi derivate
- 11. Forza per reimplementare una funzione statica nelle classi ereditarie
- 12. C++ Boost serializzazione serializzazione di classi derivate templated
- 13. Java classi astratte: Tornando puntatore "this" per le classi derivate
- 14. dichiarazione di variabili nelle @implementation
- 15. Perché devo ri-dichiarare le funzioni sottoposte a override nelle classi derivate in C++?
- 16. Modello di fabbrica per la creazione di molte classi derivate
- 17. Uso di PDO nelle classi
- 18. C# comportamento foreach con classi derivate?
- 19. Visualizzazione delle classi derivate in C#
- 20. Utilizzando XmlSerializer per serializzare classi derivate
- 21. C++ template fusione con le classi derivate
- 22. Scala Play framework classi derivate 2.1
- 23. C++ Forward Dichiarare classi nelle classi
- 24. implementazione della proprietà force su classi derivate
- 25. specializzazione Template e classi derivate in C++
- 26. C#: Aggiunta di metodi di estensione di una classe base in modo che appaiono nelle classi derivate
- 27. Dichiarazione di tipo basata su parametri di tipo nelle classi interne
- 28. Come utilizzare le classi derivate dalla classe list di Python
- 29. Override di membri statici in classi derivate in PHP
- 30. selezionando l'elenco corretto di Enum da 2 classi derivate
fantastico! Grazie. – irisjay