[ zorrome @ 03.06.2006. 21:52 ] @
Može li mi netko objasniti kako je u tek deklariranoj klasi SiteManager moguće instancirati
objekt te klase (znači SiteManager, kod gdje su u komentaru upitnici).
Što bi to značilo - ukratko što je to, koja osobina objektno orjentiranih jezika itd.
Kod je pisan u C#

class SiteManager
{
SiteList sites = new SiteList();

public static void Main()
{
SiteManager mgr = new SiteManager(); // ????

mgr.sites = new SiteList();
// dalje kod nije bitan
}
}


////////////// ili /////////////////////
class CTest
{
CTest test = new CTest(); // ????
}


Hvala
[ Oliver Klaćik @ 04.06.2006. 01:04 ] @
Pa, ne možeš instancirati klasu unutar te iste klase... Koja bi bila svrha toga, uopšte?

A objekat možeš instancirati prilikom deklaracije ili na nekom drugom mestu (obično u konstruktoru klase ili pre nego što treba da ga upotrebiš).

Objekte deklarišeš na nivou klase ili na nivou procedura (ili čak petlji), a kada su deklarisani možeš ih instancirati gde god hoćeš. Naravno, pre nego što počneš da koristiš te iste objekte...

Ako imaš problema sa osnovama OO programiranja, bolje je da pročitaš neku knjigu o tome. Uštedećeš i vreme i živce...

[ negyxo @ 04.06.2006. 03:26 ] @
Citat:

Pa, ne možeš instancirati klasu unutar te iste klase... Koja bi bila svrha toga, uopšte?


Pa nije bas tako. Probaj da instanciras objekat tvoje klase u istoj klasi. Jedna od najcescih primena je Clone i Copy metoda. Tu se vraca kopiran objekat iste klase, tako da primena postoji. Isto tako postoji i potreba da se cuvaju i reference klase unutar iste klase. Klasican primer su linked list-e, samo sto cini mi se da je u C# upotrebom kolekcija i generics-a to sad nepotrebno raditi.
[ Oliver Klaćik @ 04.06.2006. 12:22 ] @
Da, u pravu si, može... Da budem iskren, nikada nisam ni probao, jer nikada nisam imao potrebu za tim, tako da moj komentar u vezi svrhe svega toga stoji.

Ako si nepažljiv, lako se može dobiti StackOverflowException takvim pristupom.
[ negyxo @ 04.06.2006. 12:51 ] @
Citat:
Oliver Klaćik: Da, u pravu si, može... Da budem iskren, nikada nisam ni probao, jer nikada nisam imao potrebu za tim, tako da moj komentar u vezi svrhe svega toga stoji.


Kao sto rekoh postoji potreba za tim i to u dosta slucajeva. Naci ces gomilu primera gde klasa vraca objekat iste. Razmisli malo, da nema potrebe za tim verovatno bi ogranicili taj slucaj pa bi dobio compile time error. Inace pogledaj overloading operatora i vedeces svrhu instaciranja objekta te klase u istoj.


Citat:

Ako si nepažljiv, lako se može dobiti StackOverflowException takvim pristupom.


Ako si nepazljiv izazvaces StackOverflowException onda i sa bilo kojom drugom klasom.
[ negyxo @ 04.06.2006. 13:29 ] @
Citat:

////////////// ili /////////////////////
class CTest
{
CTest test = new CTest(); // ????
}


Hvala


Ovo mi je promaklo. Ovo sto si napiso nece nikad raditi. Za ovo bi mozda trebalo ubaciti da kompajler izbaci error. Glupo je da se u konstruktoru nalazi inicijalizacija objekta same klase jer ce se zakucati u beskonacnost. Ovo se nigde ne koristi, mozda za testiranje kompajlera (izgleda da je onda C# puko )
Postoji nekad primena kada se cuvaju reference iste klase kao u linked listama. Samo sto se tamo ne vrsi incijalizacija nego se dodeljuje referenca iz "spoljnog" koda.


[ Oliver Klaćik @ 05.06.2006. 11:27 ] @
O tome sam sve vreme govorio...
[ mmix @ 05.06.2006. 11:54 ] @
Citat:
Oliver Klaćik: Pa, ne možeš instancirati klasu unutar te iste klase... Koja bi bila svrha toga, uopšte?


Samo da napomenem, instance field instanciranje je invalid (kao sto primetiste, vodi ka StackOverflow), ali static field instanciranje je sasvim validno i izmedju ostalog cini osnovu Singleton patterna.

Code:

class CTest
{
    public static CTest instance = new CTest(); 

    private CTest(): {}
}
[ mmix @ 05.06.2006. 14:35 ] @
Citat:
zorrome: Može li mi netko objasniti kako je u tek deklariranoj klasi SiteManager moguće instancirati objekt te klase (znači SiteManager, kod gdje su u komentaru upitnici).
Što bi to značilo - ukratko što je to, koja osobina objektno orjentiranih jezika itd.


Ja sad tek vidim sta si ti napisao, pratio sam thread koji je malo zalutao
Code:

class SiteManager
{
    SiteList sites = new SiteList();

    public static void Main()
    {
        SiteManager mgr = new SiteManager();     // ????

         mgr.sites = new SiteList();
 // dalje kod nije bitan
    }
}


Ovo je savrseno validno parce koda. Main je staticki metod koji kreira svoju (lokalnu) instancu SiteManager klase kojoj pripada. Main NIJE konstruktor, sto znaci da kriranje instance NECE ponovo kreirati novu isntancu SiteManager-a, dakle nema rekurzije i code radi ok. Jedina "greska" je u liniji:
Code:

mgr.sites = new SiteList();

ova linija je visak posto ce konstruktor SiteManager klase kreirati SiteList implicitno kroz liniju
Code:

SiteList sites = new SiteList();


E, sad drugi primer:
Code:

////////////// ili /////////////////////
class CTest
{
CTest test = new CTest();  // ????
}


Ovo parce koda je unelo zabunu u ovaj thread. Kreiranje field-a test se obavlja implicitno u konstruktoru i poziva opet konstruktor CTesta koji poziva konstruktor CTesta - tako dok stek ne pukne. Ovaj kod ne predstavlja uproscenu varijantu gornjeg primera i to je unelo zabunu.

Ne postoji specijalni naziv za ono sto SiteManager kalsa i njen metod Main koriste.
[ negyxo @ 05.06.2006. 18:56 ] @
Citat:

Pa, ne možeš instancirati klasu unutar te iste klase... Koja bi bila svrha toga, uopšte?


Olivere, Olivere... dok ja skontam sta hoces da kazes. Trebao si napisati da ne mozes da instaciras klasu u konstruktoru a ne generalno u celoj klasi, kao na primer u nekoj f-ji. E sad je jasno
[ mmix @ 05.06.2006. 21:20 ] @
Citat:
negyxo: Olivere, Olivere... dok ja skontam sta hoces da kazes. Trebao si napisati da ne mozes da instaciras klasu u konstruktoru a ne generalno u celoj klasi, kao na primer u nekoj f-ji. E sad je jasno


Hmm, zapravo i to moze , samo mora da se iskontrolise proces i prekine u nekom trenutku, npr:

Code:

public class Chain
{
    public Chain nextLoop = null;
    public Chain(int steps)
    {
        if (steps != 0) nextLoop = new Chain(steps-1);
    }
}


Narafski, mozda me neko demantuje ako zna, ali mislim da se slicno zaista ne moze napraviti preko default constructora a da bude thread safe.
[ negyxo @ 06.06.2006. 06:45 ] @
Code:

new Chain(-1);


Stack?

Dobor, ajde onda treba jos jedna ispravka. Ne moze sve to sa default konstruktorom
[ mmix @ 06.06.2006. 13:26 ] @
Citat:
negyxo
Code:

new Chain(-1);


Stack?


Hehe, good catch. Poenta je bila da konstrukcija objekta nema veze sa kontekstom, bilo koji tip koji nasledjuje Object moze se instancirati na bilo kom mestu u kodu ukljucujuci i metode/konstruktore svog sopstvenog tipa, i da eto postoje bar dve konkretne primene za takvo instanciranje...
[ misk0 @ 07.06.2006. 22:12 ] @
Mozda moze ovako

Code:

class Nova {
  static public int Count=0;

  public Nova() {
    Count++;
    if (Count < 10)
    {
        Nova NovaKlasa = new Nova();
    }
    Console.WriteLine(Count);
  }
}


Pisao sam iz glave, vjerovatno ima gresaka, htio sam naglasiti kako se sa static fieldom moze brojati broj instanci i na taj nacin izbjeci eventualnu beskonacnu petlju.
[ negyxo @ 08.06.2006. 07:18 ] @
I sta posle 10-og new Nova(), nestalo objekata :)
Ma nije poenta u tome kako instacirati istu klasu unutar njenog konstruktora nego da je to moguce uraditi bilo gde, mada jedini izuzetak bi bili konstruktori jer bi to bilo lose resenje. Ako vec treba da se cuva referenca na sopstveni tip onda se to moze odraditi preko propertija.

Code:

public class TestClass
    {
        TestClass _anotherMe = null;

        public TestClass()
        {
        }

        public TestClass AnotherMe
        {
            get
            {
                if (_anotherMe == null)
                    _anotherMe = new TestClass();

                return _anotherMe;
            }
        }
    }