# Klasser och instanser

Klasser är ett sätt att klumpa ihop variabler och metoder som hör till samma "sak" i ett spel eller ett program. De gör det lättare att felsöka och lättare att hålla god struktur.

Man kan betrakta en **klass** som en ritning för något - "såhär ska fiender i spelet se ut - de ska ha de här egenskaperna".

Sedan skapar man **instanser** av klassen - de konkreta, faktiska fienderna. Alla goombas i Super Mario Bros och alla paladiner i World of Warcraft bygger på samma ritning. De har samma egenskaper och utseende i grunden, även om de skiljer sig åt i vilka värden en del av egenskaperna har. De befinner sig till exempel på olika positioner, även om de alla *har* en position.

## Skapa klasser

Generellt bör varje klass läggas i sin egen fil. Med C# Dev Kit finns ett snabbt och enkelt sätt:

* Gå till **Explorer** och öppna **Solution Explorer**.
* **Högerklicka på projektet** klassen/filen ska läggas till i.
* Välj **"Add new File"**.
* Välj **"Class"**.
* Skriv in namnet på klassen – glöm inte [namngivning ](/grundlaggande/namngivning.md)med **PascalCase**!
* Skriv in skriv in **using** och namnet på klassens **namespace** högst upp i Program.cs

{% code title="Goomba.cs" lineNumbers="true" %}

```csharp
namespace PlumberPlatformer

class Goomba
{
  // Klassvariabler
  public int X = 0;
  public int Y = 0;
  public bool IsDead = false;
}
```

{% endcode %}

{% code title="Program.cs" %}

```csharp
using PlumberPlatformer;

```

{% endcode %}

## Skapa instanser

Kodordet `new` skapar **nya instanser** i minnet ([heapen](/grundlaggande/reference-vs-value-types.md#minnet-stacken-och-heapen)).

Därefter behöver en [referens ](/grundlaggande/reference-vs-value-types.md)till instansen lagras någonstans, till exempel i en variabel.

{% code lineNumbers="true" %}

```csharp
Goomba g1 = new Goomba();
Goomba g2 = new Goomba();
```

{% endcode %}

Därefter kan man ändra på de individuella instansernas variabler separat:

{% code lineNumbers="true" %}

```csharp
g1.X = 60;
g1.Y = 20;
g2.X = 80;
g2.Y = 25;
```

{% endcode %}

Man kan också tilldela värden till variablerna direkt när instansen skapas:

```csharp
Goomba g3 = new Goomba() {x = 10, y = 6};
```

### New()

Om man (som ovan) skapar en instans av exakt samma klass som variabeln så kan koden förenklas. Det gäller med andra ord nästan jämt – undantaget är vid [polymorfism](/klasser-och-objektorientering/polymorfism.md#polymorfism-klasser-och-arv).

{% code lineNumbers="true" %}

```csharp
Goomba g4 = new();
Goomba g5 = new() {X = 100};
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://csharp.progdocs.se/klasser-och-objektorientering/klasser-och-instanser.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
