Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Instancirani objekt u klasi u C# - nije mi jasno?

  • 14 odgovora
  • 4.714 pregleda

Najnovija ↓

Instancirani objekt u klasi u C# - nije mi jasno? 03.06.2006. u 22:52 · pre 248 meseci #1
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
Re: Instancirani objekt u klasi u C# - nije mi jasno? 04.06.2006. u 02:04 · pre 248 meseci #2
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...

Potpis
Oliver 'FAQ' Klaćik
Re: Instancirani objekt u klasi u C# - nije mi jasno? 04.06.2006. u 04:26 · pre 248 meseci #3
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.
Re: Instancirani objekt u klasi u C# - nije mi jasno? 04.06.2006. u 13:22 · pre 248 meseci #4
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.
Potpis
Oliver 'FAQ' Klaćik
Re: Instancirani objekt u klasi u C# - nije mi jasno? 04.06.2006. u 13:51 · pre 248 meseci #5
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.
Re: Instancirani objekt u klasi u C# - nije mi jasno? 04.06.2006. u 14:29 · pre 248 meseci #6
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.


Re: Instancirani objekt u klasi u C# - nije mi jasno? 05.06.2006. u 12:54 · pre 248 meseci #8
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(): {}
}
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Instancirani objekt u klasi u C# - nije mi jasno? 05.06.2006. u 15:35 · pre 248 meseci #9
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.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Instancirani objekt u klasi u C# - nije mi jasno? 05.06.2006. u 19:56 · pre 248 meseci #10
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 :)
Re: Instancirani objekt u klasi u C# - nije mi jasno? 05.06.2006. u 22:20 · pre 248 meseci #11
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. :)
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Instancirani objekt u klasi u C# - nije mi jasno? 06.06.2006. u 14:26 · pre 248 meseci #13
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...
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Instancirani objekt u klasi u C# - nije mi jasno? 07.06.2006. u 23:12 · pre 248 meseci #14
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.
Potpis
:: Nemoj se svadjati sa budalom, ljudi cesto nece primjetiti razliku ::
Re: Instancirani objekt u klasi u C# - nije mi jasno? 08.06.2006. u 08:18 · pre 248 meseci #15
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;
            }
        }
    }
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme