# Kavramlar - Temel Sınıflar

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/BaseClasses
- **Çeviri tarihi:** 2025-09-08

## Terimler ve Tanımlar

Bir **Sınıf** (Class), kodda tanımlanmış ve Örnekler (Instances) için bir şablon görevi gören Fonksiyonlar ve Değişkenler topluluğudur.
Örnek olarak [Oyuncu (The Player)](https://gmod.tr/wiki/Player), [Varlıklar (Entities)](https://gmod.tr/wiki/Entity), [Oyun Modları (Gamemodes)](https://gmod.tr/wiki/Structures/GM), [VGUI Elemanları (VGUI Elements)](https://gmod.tr/wiki/VGUI_Element_List) ve daha fazlası verilebilir.

Bir **Örnek** (Instance), oyunda aktif olan bir Sınıfın kopyasıdır. Tek bir Sınıfın birden fazla Örneği aynı anda aktif olabilir.
Örneğin: Sandbox Oluşturma Menüsünden bir nesne (prop) oluşturulduğunda, oyun `prop_physics` Sınıfının bir Örneğini oluşturur.
`prop_physics` Sınıfı kodda yalnızca bir kez tanımlanır, ancak herhangi bir sayıda Örnek oluşturmak için kullanılabilir.
Bilgisayar donanımını verimli kullanmak için, bir Sınıfın mantığı her Örneğe kopyalanmaz, bunun yerine tüm Örnekler Sınıftaki aynı tanıma geri döner. Bu işlem [Meta Tabloları](https://gmod.tr/wiki/Meta_Tables) (Meta Tables) aracılığıyla gerçekleştirilir.

Bir **Temel Sınıf** (Base Class) (veya **Ebeveyn Sınıf** - Parent Class), bir Sınıfın (Ebeveyn Sınıfın **Alt Sınıfı** - Child Class) varsayılan olarak sahip olduğu Fonksiyonlar ve Değişkenler kümesidir. Ebeveyn Sınıf tarafından verilen (veya miras alınan) davranış, Ebeveyn Sınıftan Miras Alınan Fonksiyonlara ve Değişkenlere ekleme yapılarak, bunların üzerine yazılarak ve değiştirilerek Alt Sınıfta düzenlenir. Bu, bir Sınıfın, diğer Sınıfın mantığını sıfırdan yeniden oluşturmaya gerek kalmadan davranışını kopyalamasına olanak tanır. Mantığın gereksiz yere kopyalanmasını önlemek için, bir Alt Sınıf, bir Fonksiyon veya Değişken için üzerine yazılmış bir tanıma sahip olmadığı durumlarda Ebeveyn Sınıfının Meta Tablosuna başvurur.
**Not:** Tüm Sınıfların tam olarak bir (1) Temel Sınıfı olmalıdır, ancak herhangi bir sayıda Alt Sınıfı olabilir.

## Temel Sınıfları Nasıl Kullanırsınız?

### Örnek

Aşağıdaki örnek, bir [Varlığın (Entity)](https://gmod.tr/wiki/Entity) birden fazla Alt Varlık için nasıl Temel Sınıf olarak kullanılabileceğini göstermektedir.

Ebeveyn Sınıf (`sent_parentclass.lua`), Varlığın modelini ve fiziğini ayarlamaya yönelik tüm mantığı ve Varlığın benzersiz davranışının arkasındaki mantığı yönetir. Bu durumda, benzersiz davranış, varlık çizilmeden önce rastgele bir görsel efektin etkinleştirilmesi ve çizildikten sonra devre dışı bırakılmasıdır. Ebeveyn Sınıfta, bu görsel efekt Varlığı sadece maviye çevirir.

Alt Sınıflar (`sent_childclass_1.lua` ve `sent_childclass_2.lua`), Temel Sınıflarının (`sent_parentclass.lua`) mantığını koruduğu için, farklı görsel efektler oluşturmak amacıyla çok az miktarda kod eklemeleri yeterlidir.

`sent_childclass_1.lua`, görsel efekti etkinleştiren fonksiyonun üzerine yazar ve Ebeveyn Sınıfın mavi renk efektini bir gökkuşağı renk efektiyle değiştirir.
`sent_childclass_2.lua`, görsel efektin hem etkinleştirme hem de devre dışı bırakma fonksiyonlarının üzerine yazar. Bunlar, Varlığın (artık bir lastik gibi görünen) hareketsizken bile sürekli dönüyormuş gibi görünmesini sağlayan fonksiyonlarla değiştirilir.

#### sent_parentclass.lua

```lua
AddCSLuaFile()

-- Tüm Varlıkların bir Temel Sınıfı olmalıdır.
-- Bu durumda, "base_anim" Sınıfı kullanılmaktadır.
-- Bu, Garry's Mod'da mevcut olan varsayılan Varlık Sınıflarından biridir.
DEFINE_BASECLASS( "base_anim" )

ENT.PrintName = "Parent Class"
ENT.Category = "BaseClass Example"
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
ENT.Spawnable = true

-- Bu değişken, bir Temel Sınıfın alt sınıflarına hem fonksiyonlar
-- hem de değişkenler sağladığını göstermek için vardır.
-- Bu, normal genişlikte bir sandık modelidir.
ENT.ModelToSpawnWith = "models/props_junk/wood_crate001a_damaged.mdl"

-- Varlığı ayarla
function ENT:Initialize()
    if SERVER then
        self:SetModel( self.ModelToSpawnWith )
        self:PhysicsInit( SOLID_VPHYSICS )
        self:SetMoveType( MOVETYPE_VPHYSICS )
        self:SetSolid( SOLID_VPHYSICS )
    end
end

-- Bu, alt sınıfların Temel Sınıflarındaki fonksiyonların üzerine
-- yazabildiğini göstermek için kullanacağımız özel bir fonksiyondur.
function ENT:EnableVisualEffects()
    -- Yaklaşan render işlemini mavi görünecek şekilde değiştir.
    render.SetColorModulation( 0, 0, 1 )
end

-- Bu özel fonksiyon, alt Varlık tarafından üzerine yazılmayacaktır, ancak bu
-- tamamen gösterim amaçlıdır. Temel Sınıftaki herhangi bir fonksiyon,
-- alt sınıfları tarafından üzerine yazılabilir.
function ENT:DisableVisualEffects()
    -- Render sisteminin rengini sıfırla.
    render.SetColorModulation( 1, 1, 1 )
end

-- Burada, varlığın nasıl çizildiğini değiştirmek için yukarıdaki özel fonksiyonları kullanıyoruz.
-- Bu fonksiyonu alt sınıfta üzerine yazmadığımız için, bu fonksiyon
-- alt Varlığın Draw (Çizim) fonksiyonu olacaktır.
function ENT:Draw()
    self:EnableVisualEffects()
    self:DrawModel()
    self:DisableVisualEffects()
end
```

#### sent_childclass_1.lua

```lua
AddCSLuaFile()

-- Temel Sınıfımızı, fonksiyonları ve değerleri miras almak istediğimiz Sınıf olarak ayarlıyoruz.
-- DEFINE_BASECLASS kullanmak da aynı derecede geçerli olurdu.
-- baseclass.Get(), her iki seçeneğin de uygulanabilir olduğunu göstermek için burada kullanılıyor.
ENT.BaseClass = baseclass.Get( "sent_parentclass" )

ENT.PrintName = "Rainbow Child Example"
ENT.Category = "BaseClass Examples"
ENT.Spawnable = true

-- Temel Sınıfımızda Varlığın modelini ayarlamak için kullanılan değişkenin üzerine yaz
-- ENT:Initialize() fonksiyonunun üzerine yazmadığımız için, bu mantık
-- tam olarak Temel Sınıfımızda göründüğü gibi çalışacak, ancak Temel Sınıfta
-- tanımlanan değer yerine bu değerle çalışacaktır.
-- Bu, ekstra geniş bir sandık modelidir.
ENT.ModelToSpawnWith = "models/props_junk/wood_crate002a.mdl"

-- Varlığın rengini rastgele hale getirmek için görsel efektler fonksiyonunun üzerine yaz.
function ENT:EnableVisualEffects()
    local red   = math.Remap( math.sin( CurTime() * 2 + 1 ), -1, 1, 0, 1 )
    local green = math.Remap( math.cos( CurTime() * 3 + 2 ), -1, 1, 0, 1 )
    local blue  = math.Remap( math.sin( CurTime() * 4 + 3 ), -1, 1, 0, 1 )
    render.SetColorModulation( red, green, blue )
end
```

#### sent_childclass_2.lua

```lua
AddCSLuaFile()

ENT.BaseClass = baseclass.Get( "sent_parentclass" )

ENT.PrintName = "Perpetual Motion Child Example"
ENT.Category = "BaseClass Examples"
ENT.Spawnable = true

ENT.ModelToSpawnWith = "models/props_vehicles/tire001c_car.mdl"

-- Temel Sınıfın mavi efektini, dönüyormuşuz gibi gösteren bir efektle değiştir
function ENT:EnableVisualEffects()
    local matrix = Matrix(  )
    matrix:SetAngles( Angle( 0, 0, CurTime() * 200 ) )

    self:EnableMatrix( "RenderMultiply", matrix )
end

-- Varlığın rengini Temel Sınıfın yaptığı gibi değiştirmediğimiz için,
-- efekti uygun şekilde devre dışı bıraktığımızdan emin olmak için bu fonksiyonun üzerine yazmamız gerekiyor.
function ENT:DisableVisualEffects()
    self:DisableMatrix( "RenderMultiply" )
end
```

**Çıktı:** Aşağıda, soldan sağa doğru sırasıyla şunları görebilirsiniz:
1. Ebeveyn Sınıf `sent_parentclass` (Mavi sandık)
2. Birinci Alt Sınıf `sent_childclass_1` (Gökkuşağı sandık)
3. İkinci Alt Sınıf `sent_childclass_2` (Dönen lastik)

[Video](https://gmod.tr/api/uploads/wiki/a163d90ffbecc940ff22.mp4)

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/BaseClasses
