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

C# apstraktni metodi

[es] :: .NET :: C# apstraktni metodi

[ Pregleda: 3780 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon C# apstraktni metodi31.01.2011. u 10:27 - pre 160 meseci
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?
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# apstraktni metodi31.01.2011. u 10:54 - pre 160 meseci
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?
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ć
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: C# apstraktni metodi31.01.2011. u 10:54 - pre 160 meseci
Cek, kako ne moze biti apstraktna kada ima neku implementaciju? Pa to je glavna poenta; inace bi koristio interface.
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: C# apstraktni metodi31.01.2011. u 11:23 - pre 160 meseci
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.
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# apstraktni metodi31.01.2011. u 12:16 - pre 160 meseci
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()'

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ć
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: C# apstraktni metodi31.01.2011. u 12:48 - pre 160 meseci
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.
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# apstraktni metodi31.01.2011. u 13:15 - pre 160 meseci
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
    {
    }

}
 

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ć
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: C# apstraktni metodi31.01.2011. u 13:24 - pre 160 meseci
: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.
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: C# apstraktni metodi31.01.2011. u 13:25 - pre 160 meseci
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)).
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: C# apstraktni metodi31.01.2011. u 13:50 - pre 160 meseci
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...

if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# apstraktni metodi31.01.2011. u 14:12 - pre 160 meseci
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.


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ć
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

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



+311 Profil

icon Re: C# apstraktni metodi31.01.2011. u 14:30 - pre 160 meseci
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!
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# apstraktni metodi31.01.2011. u 14:54 - pre 160 meseci
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.
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ć
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.evj-kabel.net.



+14 Profil

icon Re: C# apstraktni metodi31.01.2011. u 18:07 - pre 160 meseci
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...
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 466



+172 Profil

icon Re: C# apstraktni metodi03.11.2011. u 22:55 - pre 151 meseci
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?


ER
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: C# apstraktni metodi03.11.2011. u 23:57 - pre 151 meseci
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");

 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 466



+172 Profil

icon Re: C# apstraktni metodi04.11.2011. u 00:24 - pre 151 meseci
HVALA, HVALA...

Eh, šta uradi jedno izostavljeno override! (greška u skripti)
ER
 
Odgovor na temu

[es] :: .NET :: C# apstraktni metodi

[ Pregleda: 3780 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

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