Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Mozganje oko kreiranja klase

[es] :: .NET :: .NET Desktop razvoj :: Mozganje oko kreiranja klase

[ Pregleda: 3239 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Mozganje oko kreiranja klase22.10.2014. u 07:39 - pre 115 meseci
Pokusavam malo dublje da udjem u problematiku kreiranja klasa pa me zanima hipotetički da li je nešto moguće napraviti i kako.

Npr imam sledeću klasu:
Code:

Public Class Stol
    Public Tabla(5) As Integer


    Public Sub Clear()
        For i = 0 To 4
            Tabla(i) = 0
        Next
    End Sub

End Class


Radi se o jednostavnom primeru gde sam kreirao klasu Stol koja služi npr za neku igru ili tome slično. U klasi Stol nalazi se niz Tabla koji u kome se čuvaju stanja polja te table, tj npr 0 - ako je polje prazno, 1 - ako je na polju prvi igrac, 2 - ako je na polju drugi igrac itd...

Kada u programu koristim klasu i npr želim da resetujem tablu to ću uraditi na sledeći način:
Code:

        Dim MyStol As New Stol
        MyStol.Clear()


I to je sve ok i vrlo jednostavno. Međutim zanima me da li je moguće kreirati sledeću klasu koju bih pozivao na sledeći način:
Code:

        Dim MyStol As New Stol
        MyStol.Tabla.Clear
        MyStol.Tabla.Reset


Ili npr:
Code:

        MyStol.Tabla.Reset.Full
        MyStol.Tabla.Reset.Deo


Dakle zanima me kao se pravi klasa koja se sastoji od podklasa pa je pozivam nazivKlase.Nešto.NeštoDrugo.NeštoTreće...
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 07:46 - pre 115 meseci
Sta je Reset?
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 08:25 - pre 115 meseci
Ovaj primer je nebitan.
Hajde da probam da pojednostavim.

Hteo bih na ovaj način da pozivam klasu.
Code:

Dim MyStol As New Stol
        MyStol.Tabla.Clear
        MyStol.Tabla.Reset


Clear je rutina koja ce niz koji pamti stanja polja na tabli postaviti na 0, tj na ni jednom polju nema niti jedne figure.
Reset rutina je npr, sub koji će postaviti figure na početnu poziciju (na neka polja će upisati 1 - da je na njima prvi igrac, na neka polja 2- da je na njima drugi igrac i 0-da su neka polja prazna.

U biti meni taj primer nije preterano bitan već pokušavam da kreiram klasu koja nešto radi a sastojaće se od nekih podklasa (ako je taj izraz podklasa uopšte ispravan).

Želim da pozovem klasu MyStol i da u njoj imam različite opcije. Npr opcije za praćenje stanja table koju bih pozivao sa MyStol.Tabla i da u okviru "Tabla" mogu da pozivam različite sub rutine npr Clear (brisanje figura sa table), Reset (postavljanje figura na početnu poziciju) itd.

Zatim da u toj klasi MyStol mogu da imam i drugačije opcije npr MyStol.ProveraNošenja koja će se opet sastojati iz rutina za ProveruNošenja, dakle:
Code:

       MyStol.ProveraNošenja.Nešto


Možda sam razumevanje previše zakomplikovao ovim primerom.
U jednoj rečenici zanima me kako da napravim klasu koju pozivan npr kao ovo:
Code:

PictureBox1.Controls.Add
PictureBox1.Controls.Clear
PictureBox1.Controls.CopyTo

PictureBox1.Cursor.Draw
PictureBox1.Cursor.Dispoze


Dakle pretpostavljam da je taj PictureBox klasa, koja se sastoji od podklase Controls u vezi koje imam subrutina Add, Clear, CopyTo a takođe imam i podklasu Cursor koja se sastoji iz rutina vezanih za kursor. Možda je ovako najjasnije šta želim.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 08:44 - pre 115 meseci
Ne treba ti podklasa nego ti treba field ili property (bolje property) ciji je tip neka druga klasa.
Dakle, ovako nesto:

Code:

Public Class Table
    Public Data(5) As Integer

    Public Sub Clear()
        For i = 0 To 4
            Data(i) = 0
        Next
    End Sub
End Class

Public Class Stol
    Public Tabla as New Table
End Class


I onda mozes imati nesto ovako:

Code:

Dim MyStol As New Stol
MyStol.Tabla.Clear()


Dakle, Tabla ti je promenljiva pa onda njoj pozivas Clear().
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 08:52 - pre 115 meseci
To je to što mi treba.
Vidiš kako je jednostavno ali ne znam...

Hvala Shadowed!
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 10:25 - pre 115 meseci



[Ovu poruku je menjao Blue82 dana 22.10.2014. u 15:32 GMT+1]

[Ovu poruku je menjao Blue82 dana 22.10.2014. u 15:32 GMT+1]
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 14:33 - pre 115 meseci
Code:
 
Public Class Table

    Public Data(5) As Integer

    Public Sub Clear()
        For i = 0 To 4
            Data(i) = 0
        Next
    End Sub

End Class



Public Class Kontrola

    Public Function DaLiJeSlobodnoPolje(ByVal X As Integer, ByVal Y As Integer) As Boolean
        DaLiJeSlobodnoPolje = False


    End Function

End Class


Kako da u klasi Kontrola očitam vrednost Data(2) iz klase Table?
Mislim jasno mi je da mogu Data da definišem kao Public i da je stavim u Module ali onda neću moći da joj pristupim na način:

Code:

      MyStol.Tabla.Data(1) = 1


A ne bih da izgubim tu mogućnost. Da li je uopšte to izvodljivo?
Jasno mi je da su pitanja malo glupa i da se sve to može rešiti drugačije, ali želim da vidim sve mogućnosti koje ne shvatam do kraja u kreiranju klase.


 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 14:47 - pre 115 meseci
Mislim da gresis u shvatanju uloge klase.

Ne menjas klasi nista. Mozes tek nekom objektu menjati. Melo me zeza VB sintaksa, nisam jako dugo radio u njemu pa ne mogu lepo da ti dam primer, ali trebas imati objekat koji je instanca klase (klasa je kao sablon za objekat) i onda na njemu mozes menjati te vrednosti. Bitna je ona "New" kljucna rec. Mozda da napravis korak-dva unazad, obnovis malo te delove OOP-a pa onda opet nastavis.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 15:03 - pre 115 meseci
Ja klasu shvatam kao nešto što pomaže preglednosti programa. Naravno nije joj to svrha, ali konkretan problem sam zamislio ovako. Npr napravim klasu Igra, koja sardži delove

1. - Tabla, u kojoj cuvam dvodimenzionalni niz gde se čuvaju podaci koji igrac se nalazi na kom polju, tj tu se pamti stanje figura na tabli.
2. - Kontrola, koja će sadržavati različite kontrole


Dalje, Tabla sadrži svoje delove koji se tiče manipulacije sa samom tablom:
1. - clear (da obrise sva polja u nizu u kome se cuvaju podaci o stanju na tabli)
2. - reset (da postavi figure na pocetnu poziciju)
....
....

I onda ja elegantno prilikom pisanja program kažem sledeće:
Igra.Tabla.Clear - i obrišem stanje na tabli
Igra.Tabla.Reset - resetujem stanje na pocetnu poziciju

if Igra.Kontrola.DaLiJeSlobodnoPolje(2,3) = true then ....


I na taj način dobijem jako lep code, koji je lako prepravljati jer sve se nalazi na svom logičnom mestu. Sve vezano za tablu je u Igra.Tabla. i slično.
Jasno mi je i ono čemu služi NEW. Ja kada kreiram neku klasu onda je mogu povezivati sa drugim delovima programa ili sa drugim programima tako što kažem Dim MojaIgra as New Igra i tako u jednom redu dobijam svu funkcionalnost klase koju sam napravio koja je povezana sa MojaIgra.

Ali me u ovom konkretnom pitanju zanima kada pozovem npr.
Code:
If MyStol.Kontrola.DaLiJeSlobodnoPolje(1, 1) = True Then


onda klasa DaLiJeSlobodnoPolje ne ume da očita vrednosti sa table i ne zna šta se nalazi na polju Data(1,1) zato što je ono definisano u klasi "Table". Ja to mogu rešiti zaobilaznim putem i verovatno ružnim kodom, pa me zanima mogu li nekako komunicirati između te 2 klase da očitam vrednost polja Data(1,1) ili to nije moguće.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 15:42 - pre 115 meseci
Razmišljanje ti je jako dobro, ali su ti i tehnika a i OOP koncepti slaba strana,
a obično je situacija obrnuta - mnogo ljudi razume koncept klase i instance ali nemaju osećaj za dobar
OOP dizajn (lep koncept, kao ovo što si ti napisao u prvom delu posta).

Konkretno, da bi pristupio instanci Table iz instance Kontrola, moraš nekako da ih "povežeš".
Na primer, možeš da ih povežeš preko Stol-a kom pripadaju:
Code:

Public Class Stol

    Public Tabla as New Table

    Public Kontrola as New Kontrola

End Class

Public Class Table

    Public Stol As Stol
    Public Data(5) As Integer

    Public Sub Clear()
        For i = 0 To 4
            Data(i) = 0
        Next
    End Sub

End Class



Public Class Kontrola

    Public Stol As Stol
    Public Function DaLiJeSlobodnoPolje(ByVal X As Integer, ByVal Y As Integer) As Boolean
        DaLiJeSlobodnoPolje =  Stol.Tabla.Data...

    End Function

End Class

Dim MyStol As New Stol
MyStol.Tabla.Stol = Stol
MyStol.Kontrola.Stol = Stol

MyStol.Tabla.Clear
MyStol.Tabla.Reset
...



Ovo ti je samo koncept, naravno trebalo bi lepše napisati kod, koristiti read only propertije, Stol slati preko konstruktora, itd...
ali i ovo će da ti radi za početak kao ilustracija.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-8.sezampro.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 16:56 - pre 115 meseci
Dusane, ako je ovo code, nije uspeo da mi poveze:

U form1 stoji
Code:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim MyStol As New Stol
        MyStol.Tabla.Clear()
        If MyStol.Kontrola.DaLiJeSlobodnoPolje(1) = True Then MsgBox("da") Else MsgBox("ne")
    End Sub
End Class


u klasi stoji:

Code:

Public Class Stol

    Public Tabla As New Table
    Public Kontrola As New Kontrola

End Class

Public Class Table

    Public Stol As Stol
    Public Data(5) As Integer

    Public Sub Clear()
        For i = 0 To 4
            Data(i) = 0
        Next
    End Sub

End Class



Public Class Kontrola

    Public Stol As Stol
    Public Function DaLiJeSlobodnoPolje(ByVal X As Integer) As Boolean
        If Stol.Tabla.Data(X) = 1 Then Return (True) Else Return (False)
    End Function

End Class


u klasi kontrola u liniji If Stol.Tabla.Data(X) = 1 dobijam gresku da objekat nije setovan, tj da je null sto znaci da ga nije pravilno povezao sa nizom. Negde sam pogresio?
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 17:03 - pre 115 meseci
Pa fale ti linije za setovanje Stola za instance Table i Kontrole, napisao sam gore:
Code:

Dim MyStol As New Stol
MyStol.Tabla.Stol = MyStol 
MyStol.Kontrola.Stol = MyStol 
...



[Ovu poruku je menjao dusans dana 22.10.2014. u 18:29 GMT+1]
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-8.sezampro.rs.



+322 Profil

icon Re: Mozganje oko kreiranja klase22.10.2014. u 17:15 - pre 115 meseci
To sam prvo bio napisao pa kad sam dobio gresku mislio sam da si to nesto uopsteno stavio :)





Update:
Dusane, sada vidim da si izmenio gore code.
Ovo je to sto mi je potrebno, hvala ti na pomoci.


[Ovu poruku je menjao Blue82 dana 22.10.2014. u 21:49 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Mozganje oko kreiranja klase

[ Pregleda: 3239 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.