CoolBasic V3: Esittely
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: CoolBasic? kuollut? eheei ole...
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Perintä on oikea tapa lähteä ratkaisemaan tällaista ongelmaa. CoolBasic V3:ssa voidaan omia tietotyyppejä luoda struktuureilla ja luokilla; Struktuurit elävät pinossa (stack), joten niillä on määrätty elinaika. Luokat taas elävät kasassa (heap), joten niiden elämä loppuu vasta kun olio tuhotaan (tämä on manuaalista V3:ssa, automaattista roskienkerääjää ei toistaiseksi ole toteutettu). Tilanteesta riippuen joskus on fiksua luoda struktuuri luokan sijaan. Mutta struktuurit eivät voi periä toisiaan (ainakaan "is a"-merkityksessä). Sen sijaan sekä luokkia että struktuureita voidaan yhdistää "has a"-tavan mukaisesti. Käytännössä tämä tarkoittaa sitä, että struktuurissa tai luokassa määritellään jäsenmuuttuja, joka on sitä tietotyyppiä, jonka toiminnallisuuteen halutaan laajentaa.Ruuttu wrote:En tiedä miten tämä toimisi teknisesti jne jne, mutta onhan V3:ssa mahdollista antaa esim. objektille "rajaton" määrä muuttujia? Nykyisessä CoolBasicissa tulee välillä tilanne jossa yksi vihollinen tarttis 20 muuttujaa n ja toinen vihollinen vain 5. Sitten pistät 20 fieldiä, ja puolella vihollisista jää 3/4 niistä käyttämättä.
Toteutus struktuurilla tai luokalla
Code: Select all
Structure PerusVihollinen
Public HP As Integer
EndStructure
Structure AutoVihollinen
Public perus As PerusVihollinen
Public bensiini As Integer
EndStructure
Structure IhmisVihollinen
Public perus As PerusVihollinen
Public adrenaliini As Integer
EndStructure
Module Peli
// Peli alkaa aina Main-funktiosta
Function Main()
Dim auto As AutoVihollinen
Dim sotilas As IhmisVihollinen
auto.perus.HP = 100
auto.bensiini = 50
sotilas.perus.HP = 90
sotilas.adrenaliini = 0
//sotilas.bensiini = 0 // Tämä ei tietenkään toimi, annetaan käännösvirhe
EndFunction
EndModule
Toteutus luokalla ja perinnällä
Code: Select all
// Kirjoitan ei-julkiset jäsenmuuttujat alaviivalla. Tämä ei tietenkään ole pakollista, se on vain henk. koht. tapa
Class PerusVihollinen
Protected _HP As Integer // Tämä voisi olla myös Public, mutta hyviin tapoihin kuuluu ennemmin luoda Property joka muuttaa tämän arvoa. Itse asiassa tämän pitäisi olla Private ja sitten tähän pitäisi olla joko Public tai Protected Property, mutta menköön näin esimerkin nimissä simppelisti
EndClass
Class AutoVihollinen
Inherits PerusVihollinen
Private _bensiini As Integer
EndClass
Class IhmisVihollinen
Inherits PerusVihollinen
Private _adrenaliini As Integer
EndClass
Module Peli
// Peli alkaa aina Main-funktiosta
Function Main()
Dim auto As New AutoVihollinen
Dim sotilas As New IhmisVihollinen
// Huomaa, että "perus"-kenttää ei enää kirjoiteta väliin
auto.HP = 100
auto.bensiini = 50
sotilas.HP = 90
sotilas.adrenaliini = 0
//sotilas.bensiini = 0 // Tämä ei tietenkään toimi, annetaan käännösvirhe
// Tämä on luokkien hienous:
Dim vihu As New PerusVihollinen
vihu = auto
vihu = sotilas
//vihu.HP = 100 // Nyt pitäisi olla "HP"-niminen propety määriteltynä "PerusVihollinen"-luokkaan
EndFunction
EndModule
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic? kuollut? eheei ole...
Re: CoolBasic? kuollut? eheei ole...
Tarkoitan siis joskus tulevaa roskienkerääjää joka hoitaa myös muistivuodot ja new:illä varatut oliot.
Re: CoolBasic? kuollut? eheei ole...
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Ohjelmoija vapauttaa kaikki tekemänsä oliot manuaalisesti. Vähän niin kuin nykyisessäkin CB:ssä on New ja Delete.JATothrim wrote:Oi oi... näytää ihanalta. Saako roskenkerääjän asetuksia sitten muutettua? Kytkettyä kokonaan pois? Esim. erittäin muisti intensiivisessä koodissa (varataan ja vapautetaan tavaraa tieheään), jolloin nopeus on kriitinen tekijä.
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic? kuollut? eheei ole...
*oivalluksen tunne*
Eli siis jos ymmärsin oikein niin:
Voidaan tehdä ensin luokka:
Code: Select all
Class Vihu
Protected Energia As Float // <- Protected tarkoittaako se nyt sitä, ettei sitä voida enää poistaa jne?
EndClass
Class Seppo_Vihu
Inherits Vihu //<- Lapataan tässä kohtaa ylemmän luokalle määritellyt muuttujat(?) tälle luokalle.
Private Turhaantuneisuus As Integer
EndClass
Class Ismo_Vihu
Inherits Vihu //<- Lapataanpa taas sisään Vihuluokan muuttujat.
Private Tuhovoima As Float //<- Tässä kohtaa tehdään taas Ismolle omat muuttujansa
Private Vihaisuus As Integer //<- Samoin kuin tässä
EndClass
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Syntaksi on periaattetasolla ihan oikein, vaikkakin se käytännössä toteutetaan vähän eri tavalla.
En tiedä, mitä tarkoitit ilmauksella "ei voida enää poistaa" viitatessasi protected-avainsanalla määriteltyyn luokan jäsenmuuttujaan, joten en voi sanoa, oliko päättelysi oikein vai väärin. Oleellisin asia protected-määritellyssä luokkatiedossa on, että se näkyy (ja on vaikkapa metodien kautta käytettävissä) myös luokan perillisille, toisin kuin private-näkyvyydellä määritellyt.
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Re: CoolBasic? kuollut? eheei ole...
Siis käsitin että siitä Protect muuttujasta tulee vakio perillisille.. (Mutta tätä arvoa voi silti muuttaa..)SPuntte wrote:En tiedä, mitä tarkoitit ilmauksella "ei voida enää poistaa" viitatessasi
Exelent. Juuri tätä minä hain!SPuntte wrote:Oleellisin asia protected-määritellyssä luokkatiedossa on, että se näkyy (ja on vaikkapa metodien kautta käytettävissä) myös luokan perillisille, toisin kuin private-näkyvyydellä määritellyt.
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Käytettävissä vain oman luokan sisältä (eli ei "näy" ulos)
Protected
Käytettävissä oman luokan ja perittyjen luokkien sisältä
Public
Aina kaikille käytettävissä (eli "näkyy" joka paikkaan)
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic? kuollut? eheei ole...
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: CoolBasic? kuollut? eheei ole...
Hieman oudosti ilmaistu, joten laitanpa selkeyttävää koodia:programmer of DSG wrote:Siis Public tekee Luokan jäsenestä tavallaan Globaalin? :)
Code: Select all
class lol
{
int a;
public:
int b;
};
int main (void)
{
lol joku;
joku.b = 5; // toimii
joku.a = 31; // ei toimi
}
Re: CoolBasic? kuollut? eheei ole...
Niin, joo...
EDIT: Ahaa... Got it, I think.
- Dibalo
- Advanced Member
- Posts: 298
- Joined: Mon Aug 27, 2007 8:12 pm
- Location: Espoo, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Code: Select all
Class A
Public Dim muuttuja As Float
EndClass
// luodaan olio
Dim o As A = New A()
// käytetään muuttujaa
o.muuttuja = 25.365
Re: CoolBasic? kuollut? eheei ole...
- Dibalo
- Advanced Member
- Posts: 298
- Joined: Mon Aug 27, 2007 8:12 pm
- Location: Espoo, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Code: Select all
Class Ukko
Private Dim x As Integer
Private Dim y As Integer
Public Function AsetaSijainti(Dim _x, Dim _y) As Void
Me.x = _x
Me.y = _y
EndFunction
EndClass
Dim seppo As Ukko = New Ukko()
seppo.AsetaSijainti( 40, 60 ) // ok
seppo.x = 40 // virhe!
seppo.y = 60 // virhe!
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Itseasiassa niitä voi käyttää, mutta ainoastaan luokan sisältä, toisinsanoen luokan jäsenfunktioiden eli metodien kautta. Tämä mahdollistaa olion datan paremman suojaamisen, kun siihen ei suoraan pääse mistä tahansa käsiksi, joten mahdolliset koodausvirheet löytyvät ainakin osaksi jo käännösvaiheessa. Lisäksi luokan tietorakenteet voidaan piilottaa, jolloin käyttäjän ei tarvitse muuta kuin osata kutsua sopivia funktioita sopivin parametrein (edelleen siis olion metodeja), jotka hoitavat itse olion datan käsittelyn käyttäjän puolesta. Tätä kutsutaan kapseloinniksi, ja se on erityisen hyödyllistä esimerkiksi kirjastoja rakennettaessa.Timo wrote:Nyt menee vähän ohi; mitä hyötyä semmoisesta privatesta sitten on, jos sitä ei voi käyttää?
P.S. Dibalo antoikin jo aiheesta havainnollisen esimerkin.
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Re: CoolBasic? kuollut? eheei ole...
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic? kuollut? eheei ole...
Code: Select all
Class MunLuokka
Private omaaDataa As Integer
Protected yhteistaDataa As Integer
Public julkistaDataa As Integer
EndClass
Class Perillinen
Inherits MunLuokka // Perii kaikki ei-privaatit isäntäluokka "MunLuokka":sta
Public Function JokuFunktio()
omaaDataa = 5 // Virhe, tämä on "MunLuokka":n yksityistä omaisuutta
yhteistaDataa = 5 // Tämä on OK, Protected on jaettu myös kaikille jälkeläisille
julkistaDataa = 5 // Tämäkin on OK, Public on käytettävissä kaikkialta
EndFunction
EndClass
Class IhanMuuLuokka
Public Function OmaFunktio()
Dim olio As MunLuokka = New MunLuokka
olio.omaaDataa = 5 // Virhe, tämä on "MunLuokka":n yksityistä omaisuutta
olio.yhteistaDataa = 5 // Virhe, Protected on vain luokan itsensä ja sen jälkeläisten käytössä
olio.julkistaDataa = 5 // Tämä on OK, Public on käytettävissä kaikkialta
EndFunction
EndClass
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic? kuollut? eheei ole...
Olen ehkä 1 asekeleen lähempänä CB v3 kätevyyttä.
Vinkkinä vain, että te konkarimmat koodarit, teidän kannattaa kertoa asiat selkeästi sillä tavalla, että vertaatte niitä nykyisiin cbn ominaisuuksiin. Esim mitä ei nykyisessä ole ja miten se käytännössä nykyisessä cbssä ilmenisi. Se voisi helpottaa monia. Että älkää puhuko 'siansaksaa' vaan tavallaan vaikka niin, miten te käsitittä asiat silloin kun harjoittelitta sitä. Se olisi ainakin minulle hyödyllistä, uskon että muillekkin ihmisiähän me vain olemme.