2011-12-18 17 views
10

Eventuali duplicati:
Difference between object and instanceQual è la differenza tra oggetti e classi in C#?

Ho paio di domande:

  1. Ogni istanza di una classe (ad eccezione di una classe astratta) è un oggetto?
  2. Le classi astratte non possono essere istanziate, quindi non sono oggetti?

Qualcuno potrebbe aiutarmi a capire meglio i concetti di cui sopra in relazione a C#?

+0

1. Sì (dato n. 2) e 2. sì. Una palla curva è una classe statica che è fondamentalmente un singolo oggetto per la vita di un processo. –

+0

È utile pensare alle classi astratte come equivalenti alle interfacce. Sono solo interfacce in grado di fornire un'implementazione predefinita. –

+0

Correlati: http://stackoverflow.com/questions/3323330/difference-between-object-and-instance e http://stackoverflow.com/questions/3686647/whats-the-best-way-to-define-the -words-class-and-object-to-someone-who-hasn –

risposta

24
  1. Un oggetto è un'istanza di una classe.

  2. Una classe è la definizione di un oggetto. In realtà non diventa un oggetto finché non viene istanziato. Poiché una classe astratta non può essere istanziata, nessun oggetto di quel tipo può essere creato. Dovrebbe essere definita una sottoclasse per creare un oggetto.

12
  1. Sì, ogni istanza di una classe è un oggetto.

  2. Le classi (sia astratte che non) non sono oggetti. Sono tipi.

+0

Anche se astratto le classi potrebbero essere istanziate, non sarebbero ancora oggetti. –

+0

Si noti che in alcune lingue anche le classi sono oggetti. –

+0

@ marco-fiset Beh, questo è specificamente correlato a C#, quindi non sono sicuro di come altre lingue siano rilevanti anche qui. – jdmdevdotnet

2

Una classe astratta non può mai essere istanziata (e quindi non può mai diventare un oggetto). Se si crea una classe che eredita da una classe base astratta e la si istanzia, avrà proprietà della classe astratta e anche le sue proprietà. L'obiettivo alla base della creazione di una classe base astratta è quello di "far rispettare" le classi derivate per implementare determinate funzionalità (simili a un'interfaccia, ma non del tutto).

+0

Vale a dire, un'interfaccia * non può * avere * alcun * metodo implementato, ma è proprio questo: un'interfaccia. – Gravity

10

C'è un'analogia comune a mostrare forse più chiaro qual è la differenza tra i concetti di classe e oggetto.

Una classe è come una ricetta. Un oggetto è una torta. Da una ricetta puoi costruire tanti dolci. Una ricetta può contenere solo suggerimenti (essere astratto) e lasciare spazio per la propria creazione di una ricetta (classe di implementazione) dalla quale è quindi possibile creare torte (oggetti).

Quindi una classe non è un oggetto, è la descrizione di quali oggetti di tale classe sono simili. Le classi astratte contengono metodi e altre informazioni utili per l'implementazione di classi derivate da questa classe astratta. Gli oggetti non possono essere creati/istanziati da una classe astratta (perché la definizione non è completa).

2

Ogni istanza di una classe (ad eccezione di una classe astratta) è un oggetto?

Sì. Questa è la definizione di "istanza

Le classi astratte non possono essere istanziate, quindi non sono oggetti?

Le classi non sono le stesse di istanze o oggetti. Un oggetto è un'istanza di una classe. Immagina una simulazione di zoo. Un oggetto è come un leone specifico, mentre una classe è più simile a una descrizione di cosa sia un leone. Le classi astratte sono descrizioni di cose che sono troppo vaghe per rendere ragionevole costruire qualcosa basandosi solo su tale descrizione (ad esempio "Animale"). Ecco perché non puoi istanziarli. Qualcosa come un animale potrebbe essere troppo vago per il programma da richiedere direttamente; invece, il programma richiederà solo cose più specifiche come Lion, Tiger o Mongoose.

6
class Cat {} // It is a cat. Just a cat. Class is a general issue. 

myCat = new Cat("red", "5kg", "likes milk", "3 years old"); // It is my cat. It is an object. It is really a cat. 

yourCat = new Cat("gary", "3kg", "likes a meal", "5 years old"); // It is your cat. Another cat. Not my cat. It is really a cat too. It is an object; 

abstract class Animal {} // Abstract class 
animal = new Animal(); // It is not correct. What is 'animal'? Cat, dog, cow? I don't know. 

class Dog : Animal {} // It is a class. It is a dog in general. 
someDog = new Dog("brown", "10 kg", "likes cats"); // It is really a dog. It is an object.