Qual è il modo migliore per creare una libreria a due livelli, contenente una classe con diversi livelli di abilità?

2

Vorrei creare una libreria composta da due livelli, chiamiamoli A e B. Ci dovrebbe essere una classe "Sample" nel layer A. Il layer B conosce anche la classe "Sample" e la ingrandisce con alcuni metodi.

Quindi mi piacerebbe avere un altro progetto, facendo riferimento a questa libreria, così posso avere i seguenti scenari per un'istanza di "Sample", chiamiamola sample_instance:

1) using A;

Digitando "sample_instance.", Intellisense mostrerà tutti i metodi definiti nel layer A.

2) using B;

Digitando "sample_instance.", Intellisense mostrerà tutti i metodi definiti nel layer B.

3) using A;
   using B;

Digitando "sample_instance.", Intellisense mostrerà tutti i metodi definiti nei layer A e B.

Ci sto pensando da molti giorni, ma non sono in grado di trovare una soluzione adeguata. Ho sperimentato con i metodi di estensione nel livello B, che fa in modo che lo scenario 1) e 3) funzionino. Ma non posso realizzare 2) in questo modo, perché il progetto non conosce la classe "Sample" se faccio solo "using B".

Qualcuno ha una buona idea, come progettarlo?

    
posta GreenTree 30.01.2016 - 13:23
fonte

2 risposte

1

I metodi di estensione dovrebbero fare il trucco. Puoi far funzionare lo scenario 2 ridefinendo la tua classe Sample nel secondo livello attraverso l'ereditarietà. Qualcosa come

namespace A
{
    public class Sample { ... }

    public static class SampleExtensions 
    {
        public static void Foo(this Sample sample, ...) { ... }
        ...
    }
}

namespace B
{
    public class Sample : A.Sample { ... }

    public static class SampleExtensions 
    {
        public static void Bar(this Sample sample, ...) { ... }
        ...
    }
}

In questo modo, using A; dovrebbe mostrare tutti i metodi definiti in A.SampleExtensions e A.Sample , using B; dovrebbe mostrare tutti i metodi definiti in B.SampleExtensions e B.Sample (e in base all'ereditarietà A.Sample ) e using A; using B; dovrebbero mostrarti tutti.

Si noti che quest'ultimo introduce un'ambiguità sul nome del tipo Sample che può essere risolto aggiungendo using Sample = A.Sample o definendo la classe Sample in un diverso spazio dei nomi.

Inoltre, a seconda delle tue esigenze potrebbe essere saggio definire i metodi di estensione in B.SampleExtensions per estendere il tipo A.Sample invece di Sample (che è B.Sample ), cioè

public static void Bar(this A.Sample sample, ...) { ... }

Altrimenti un'istanza di A.Sample non può utilizzare un metodo di estensione definito in B.SampleExtensions anche con using B;

    
risposta data 08.05.2016 - 11:53
fonte
0

Sembra che dovresti pensare all'utilizzo dell'ereditarietà ...

  1. Rendi la classe A genitore e contiene un'istanza pubblica istanza_sempio .

  2. Rendi le classi B e C i figli, in modo che ereditino l'istanza pubblica istanza_sempio .

Nota: a turno, intellisense ti mostrerà il sample_instance pubblico come membro delle classi A, B e C.

    
risposta data 08.03.2016 - 17:23
fonte

Leggi altre domande sui tag