Come si chiamano i due tipi di classi su una dichiarazione di istanza

0

Quando dichiari una nuova istanza di una classe, lo fai in molte lingue come:

MyClass obj = new MyClass();

Il due MyClass significa cose sottilmente diverse, spesso vedrai:

IMyClass obj = new MyClass();

dove LHS è un'interfaccia o

BaseClass obj = new DerivedClass();

dove LHS è una classe base da cui l'RHS eredita.

Esiste un nome per i due diversi usi (LHS e RHS) delle classi in una dichiarazione (ad esempio classe dichiarata e classe istanziata)?

La frase che sto tentando di scrivere è:

In Xamarin, SqlCommand.ExecuteReaderAsync (CancellationToken) genera un errore di runtime e quindi nella dichiarazione, SqlCommand command = new SqlCommand() , la classe LHS deve essere modificata in DbCommand .

    
posta Jonathan Twite 18.05.2016 - 15:00
fonte

3 risposte

1

Stai dichiarando il tipo della variabile (tipo statico) e quindi istanzia l'oggetto che la variabile manterrà (tipo di runtime).

Quindi, la tua frase:

In Xamarin, SqlCommand.ExecuteReaderAsync(CancellationToken) genera un errore di runtime e quindi nella dichiarazione, SqlCommand command = new SqlCommand() , il tipo statico deve essere modificato in DbCommand .

    
risposta data 18.05.2016 - 15:03
fonte
1

I due usi sono in realtà completamente indipendenti.

Il LHS è la dichiarazione del tipo della variabile obj . Puoi mettere qualsiasi tipo lì, non solo una classe. Per esempio. in Java e C♯, potresti inserire un'interfaccia lì, in Java, potresti anche inserire un tipo primitivo lì, in C♯, potresti mettere una struct lì, in Scala, potresti inserire un alias di tipo lì. Alcune lingue hanno linguaggi di tipo più sofisticati, ad es. in Pike, potresti inserire qualcosa come string | number lì, che indica il tipo di unione di una stringa o di un numero.

Sul RHS, hai una chiamata di costruttore o un'espressione di creazione di istanza . Ma ancora una volta, non deve essere una chiamata del costruttore: qualsiasi espressione e che è compatibile con il tipo con la dichiarazione della variabile (cioè e: T e & lt ;: T var ) può essere messo lì. Ad esempio, int i = 1; è perfettamente valido, come MyClass obj = methodCallThatReturnsAnInstanceOfASubclassOfMyClass(); .

OTOH, le espressioni di creazione di istanze possono apparire ovunque possa apparire un'espressione di (un supertipo di) il tipo dell'espressione di creazione dell'istanza. Per esempio. se hai un metodo void methodThatTakesMyClassAsArgument(MyClass foo) , puoi chiamarlo con un'espressione di creazione dell'istanza come suo argomento: methodThatTakesMyClassAsArgument(new MyClass()); .

Il termine che stai cercando è tipo e non è affatto correlato alle classi.

    
risposta data 18.05.2016 - 15:31
fonte
0

Entrambi i nomi dei tipi in ogni dichiarazione sono proprio questo: "tipi". Il tipo di mano sinistra è il tipo della variabile e il tipo di mano destra è il tipo dell'oggetto che stai assegnando a quella variabile (o l'inizializzazione di tale variabile con).

Quando i due tipi sono diversi, nella maggior parte delle lingue ciò è possibile solo se il tipo di oggetto è un sottotipo del tipo di variabile a cui è assegnato. In molti casi, è naturale chiamare il tipo " tipo astratto " a sinistra o "interfaccia" e il tipo a destra il " tipo concreto ".

    
risposta data 18.05.2016 - 15:30
fonte

Leggi altre domande sui tag