Novo

Forum kao aplikacija na telefonu

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

  • 16 odgovora
  • 6.088 pregleda

Najnovija ↓

C# apstraktni metodi 31.01.2011. u 11:27 · pre 191 mesec #1
C# ima IMHO jedan ozbiljan problem, a to je da metod ne moze da bude apstraktan ako cela klasa nije apstraktna, sto moze da predstavlja problem.

Veoma cesto mi se desava da pisem osnovnu klasu koja sadrzi grubu funkcionalnost i metode koji su samo placeholderi za klasu koja ce da je nasledi. Posto osnovna klasa ima neki kod onda ne moze biti apstraktna, i samim tim placeholder metodi moraju biti virtualni (a ne apstraktni). Obicno moji placeholder metodi sadrze samo liniju "throw new MustOverrideException". Problem sa ovakvim pristupom je da se proveravanje konzistentnosti premesta na runtime i nema podrske za staticki analyze, sto se donekle izbegava pisanjem testova (eh da...). Isto tako veoma cesto je bazna klasa u svom kompajliranom asembliju i onda nije lako naci sve metode koje moras da overrajdujes jer jer source bazne klase tri servera daleko...

Verovatno je to uradjeno da bi se sprecilo kreiranje apstraktne klase, ali to su sigurno mogli da rese na druge nacine (npr. klasa koja sadrzi apstraktne metode ne sme da ima public konstruktor ili bar runtime exception pri kreiranju takve klase, sto je opet bolje od runtime MustOverride exceptiona za N metoda koje treba naci)

Postoji li neki atribut za metod ili slicna kerefeka koja bi oznacavala apstraktni metod ili bar hintovala Visual Studio da napravi skeleton implementacije?
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: C# apstraktni metodi 31.01.2011. u 11:54 · pre 191 mesec #2
Pa mora, da ne mora mogao bi da uradis nesto ovako ;)

Code (csharp):
    public class Apstrakt
    {
        public abstract int Uradi();
        public int UradiBazno()
        {
            return Uradi();
        }

...

Apstrakt x = new Apstrakt();
x.UradiBazno();
    }


Nisam bas najsigurniji sta te muci? Sta bi dobio time da imas neabstract klasu sa abstract metodima?
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: C# apstraktni metodi 31.01.2011. u 11:54 · pre 191 mesec #3
Cek, kako ne moze biti apstraktna kada ima neku implementaciju? Pa to je glavna poenta; inace bi koristio interface.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: C# apstraktni metodi 31.01.2011. u 12:23 · pre 191 mesec #4
Citat:
Shadowed: Cek, kako ne moze biti apstraktna kada ima neku implementaciju? Pa to je glavna poenta; inace bi koristio interface.

Upravo tako, ispada da jedino sto ti apstraktna klasa prakticno omogucava je draftovanje protected metoda i propertija, za razliku od interfejsa gde su obavezno public.

Citat:
mmix: Pa mora, da ne mora mogao bi da uradis nesto ovako ;)

Code (csharp):
   
public class Apstrakt
    {
        public abstract int Uradi();
        public int UradiBazno()
        {
            return Uradi();
        }

...

Apstrakt x = new Apstrakt();
x.UradiBazno();
    }



Mislio sam i na to, citiracu samog sebe :) :
Citat:
Verovatno je to uradjeno da bi se sprecilo kreiranje apstraktne klase, ali to su sigurno mogli da rese na druge nacine (npr. klasa koja sadrzi apstraktne metode ne sme da ima public konstruktor ili bar runtime exception pri kreiranju takve klase, sto je opet bolje od runtime MustOverride exceptiona za N metoda koje treba naci)



Citat:
mmixNisam bas najsigurniji sta te muci? Sta bi dobio time da imas neabstract klasu sa abstract metodima?

Stvar se svodi na to da hocu da primoram onoga koji nasledjuje klasu da implementira tacno odredjene metode, i za to hocu podrsku u samom jeziku kao sto postoji u nekim drugim programskim jezicima (npr. Delphi). Ako bacam exceptione u osnovnoj klasi necu znati da je problem sve do runtime-a dok se ne pozove bas svaki metod. Ali kao sto sam rekao bio bih zadovoljan i sa nekim atributom, npr. [MustOverrideAtribute] koji bi bacao warning tokom kompajliranja, ali izgleda da tako nesto ne postoji.
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: C# apstraktni metodi 31.01.2011. u 13:16 · pre 191 mesec #5
nema veze ako nema public kontruktor, moze da ima private koji poziva staic metod klase (hint: singleton). Isto tako bacanje exceptiona iz konstruktora bazne klase je usporavajuci faktor konstrkotora (posto se konstruktori nizu, onda bazni mora u runtimu da proverava dal je on pozvan direktno ili kao ddeo constructor-chain)

To sto ti hoces se i postize abstract-om. Ko nasledi tvoju klasu MORA da overriduje abstract metode ili kompajler nece dozvoliti formiranje tipa, zar ti to nije dovoljan warning?

Code (csharp):

    public abstract class Apstrakt
    {
        public abstract int Uradi();
    }

    public class Nasledi : Apstrakt
    {
    }
 


Error: 'abs.Nasledi' does not implement inherited abstract member 'abs.Apstrakt.Uradi()'
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: C# apstraktni metodi 31.01.2011. u 13:48 · pre 191 mesec #6
Citat:
mmix: To sto ti hoces se i postize abstract-om. Ko nasledi tvoju klasu MORA da overriduje abstract metode ili kompajler nece dozvoliti formiranje tipa, zar ti to nije dovoljan warning?


Nesto se nismo razumeli, znam da se to postize abstract-om, problem je sto ne mogu onda da imam nikakav kod u apstraktnoj klasi, tj svi metodi moraju biti apstraktni.
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: C# apstraktni metodi 31.01.2011. u 14:15 · pre 191 mesec #7
Ne moraju

Code (csharp):

    public abstract class Apstrakt
    {
        public abstract int Uradi();

        public int MojBazniKod()
        {
            return 123;
        }
    }
 

Iz reflectora:

Code (asm):


.class public abstract auto ansi beforefieldinit Apstrakt
    extends [mscorlib]System.Object
{
    .method family hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
        .maxstack 8
        L_0000: ldarg.0
        L_0001: call instance void [mscorlib]System.Object::.ctor()
        L_0006: ret
    }

    .method public hidebysig instance int32 Pozadina() cil managed
    {
        .maxstack 8
        L_0000: ldc.i4.s 0x7b
        L_0002: ret
    }

    .method public hidebysig newslot abstract virtual instance int32 Uradi() cil managed
    {
    }

}
 
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: C# apstraktni metodi 31.01.2011. u 14:24 · pre 191 mesec #8
:facepalm

U pravu si. Ne znam zasto sam bio ubedjen da moraju svi metodi biti apstraktni u apstraktnoj klasi.

Edit: Setio sam se. Kada napravim apstraknu formu ili kontrolu VS ne moze da prikaze GUI editor za nju. Davno je bilo kada sam pravio ovaj framework na kome radim pa sam zaboravio sta je tacno bio problem :)
Problem je bio sto moram da oznacim celu klasu kao apstraktnu ako ona sadrzi makar jedan apstraktan metod, sto znam da nije moralo u Delphiju gde sam pravio slicne frameworke.
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: C# apstraktni metodi 31.01.2011. u 14:25 · pre 191 mesec #9
Citat:
Boris B.: Nesto se nismo razumeli, znam da se to postize abstract-om, problem je sto ne mogu onda da imam nikakav kod u apstraktnoj klasi, tj svi metodi moraju biti apstraktni.

Imam projekat koji se bazira na tome da ne moraju :)
Tj. imam baznu klasu koja izvestan broj apstratnih funkcija i property-a i pored toga implementira neke helper funkcije i staticku funkciju za dobijanje odgovarajuce nasledjene klase (valjda to dodje factory pattern (koristim a ne pamtim nazive:))).
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: C# apstraktni metodi 31.01.2011. u 14:50 · pre 191 mesec #10
Znam da ne moraju, lupio sam i ostao ziv :)
Problem je sto ako imam apstraktne metode onda cela klasa mora da bude apstraktna, a onda ne radi VS Designer... :(
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: C# apstraktni metodi 31.01.2011. u 15:12 · pre 191 mesec #11
Da, designer mora da moze da instancira klasu, zato ti puca jer ne moze.

Bio je neki trik sa #if DEBUG ranije, ali mislim da ne radi za 2008+ designere.

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: C# apstraktni metodi 31.01.2011. u 15:30 · pre 191 mesec #12
Sama konstrukcija sa abstract metodama odnosno klasom govori da ona nije u potpunosti implementirana,
što znači da praktično i ne može da bude instancirana jer sama sebi nije dovoljna i to je jasno, da je drugačije onda upotreba abstract-a gubi smisao.
Pretpostavljam da je u Delphiju slično ali ako tamo radi instanciranje onda to u stvari nije abstraktna klasa već nešto drugo.

Sad, pošto hoćeš da radi u dizajneru jasno je da klasa ne sme da bude abstract, da mora da ima public constructor bez parametara, itd...
Kao što i sam vidiš, ne možeš u svim situacijama putem kompajlera da prisiliš nekoga da implementira nešto, zbog toga a i drugih stvari postoje contract-i.
U ovoj konkretnoj situaciji, ja bih u baznoj klasi pravio virtuelne metode i bacao Not Implemented exception-e.

Pozdrav!
Re: C# apstraktni metodi 31.01.2011. u 15:54 · pre 191 mesec #13
Delphi je ima drugaciji fazon, njemu je forma bila serijalizovana odvojeno od koda, pa si mgoao da imas sta od u pozadini forme, nista se nije isntanciralo. Dizajner je jednostavno parsirao i formirao formu na osnovu definicije. VS radi druagacije, on zaista instancira kontrole i forme i renderuje kroz njih.
Pored NotImplementedException, alternativa su ti i interface-i, provera jeste runtime (if obj is interface) ali ocompile time ne moze proci objekat sa parcijalnom implementaicjom interfejsa.
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: C# apstraktni metodi 31.01.2011. u 19:07 · pre 191 mesec #14
Upravo tako, Delphi je serijalizovao formu u DFM fajl tako da je mogla da se prikaze bez instanciranja pripadajuce klase, mada ipak mi se vise svidja .Net stil zbog cistije situacije, jer strimovanje podataka u DFM je radila svaka komponenta za sebe sto je dovodilo do gubitka podaka na celoj formi ako je jedna komponenta bila losa. Na temu, interface-i jesu resenje ali onda je sve public sto za frameworke mi nije dobro resenje. Vidim ja da cu ostati uz moj MustOverrideException... :)
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: C# apstraktni metodi 03.11.2011. u 23:55 · pre 182 meseca #15
Da ne otvaram novu temu...

Muči me bazni problem kada su u pitanju apstraktne klase i metode (početni): Potreban mi je opšti kod (ili neki neutralni primer) apstraktne klase sa apstraktnim metodom i klase koja nasleđuje tu klasu. Ono što ja imam ne radi.

Code:


using System; 
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

...
 public abstract class Racuni
    {
        ...

        
        public abstract void Pismo();
        ...
    
    }

public class RacuniP : Racuni
    {
        ...

        public void Pismo()
        {
            Console.WriteLine("realizacija apstraktnog");
        }

        ...

    }

....
// poziv

RacuniP rp1 = new RacuniP();
rp1.Pismo();



Da li apstraktni metod može da ima i parametre?

Potpis
ER
Re: C# apstraktni metodi 04.11.2011. u 00:57 · pre 182 meseca #16
Code:
public abstract class Racuni
{
    public abstract void Pismo(string poruka);
}

public class RacuniP : Racuni
{
    public override void Pismo(string poruka)
    {
        Console.WriteLine(poruka);
    }
}

// poziv
Racuni r = new RacuniP();
r.Pismo("realizacija apstraktnog");
Potpis
gramatika srpskog jezika
testovi iz srpskog jezika
jezičke nedoumice
Re: C# apstraktni metodi 04.11.2011. u 01:24 · pre 182 meseca #17
HVALA, HVALA...

Eh, šta uradi jedno izostavljeno override! (greška u skripti)
Potpis
ER
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme