Avatar billede Slettet bruger
27. februar 2008 - 19:33 Der er 22 kommentarer og
1 løsning

Lave en begrændset klasse?

Hejsa

Ligesom man kan med interfaces, hvor jeg har en klasse med metoder, men jeg vil f.eks have at det program der skal bruge denne klasse kun må få adgang til nogle af metoderne, så derfor laver jeg et interface hvor jeg kun definere de metoder som han må bruge.

Kan man gøre det samme med fields i en klasse? altså lave en base klasse, og så lave f.eks to forskellige "interfaces" der hver især har adgang til visse fields i denne klasse, som man kan med interfaces.

Nogen der ved det?
Avatar billede arne_v Ekspert
27. februar 2008 - 19:39 #1
en klasse som implementerer interface X og Y, X har property A og B, Y har property B og C,
klassen har naturligvis alle tre, properties encapsulater fields
Avatar billede nielle Nybegynder
27. februar 2008 - 19:45 #2
Hvorfor beruger du ikke bare private (eller protected / internal) på dine fields og dine funktioner?
Avatar billede nielle Nybegynder
27. februar 2008 - 19:47 #3
Interfaces er i hvert fald ikke beregnet til at skulle begrænse adgang.
Avatar billede Slettet bruger
27. februar 2008 - 19:47 #4
Altså, jeg laver noget remoting og har en User klasse. Klassen indeholder username, status osv for et chat program. Jeg vil gerne have et objekt over hver user hos clienten også, men i User klassen er der ting som clienten ikke må få adgang til, kun server.

Arne:
men man kan jo ikke definere fields i et interface`?
Avatar billede Slettet bruger
27. februar 2008 - 19:48 #5
hmm, så har jeg vidst misforstået noget...
Avatar billede arne_v Ekspert
27. februar 2008 - 20:03 #6
Du kan ikke definere fields i et interface, men du kan definere properties !
Avatar billede Slettet bruger
27. februar 2008 - 20:08 #7
hmm, hvordan gøres det?
Avatar billede arne_v Ekspert
27. februar 2008 - 20:10 #8
Avatar billede nielle Nybegynder
27. februar 2008 - 20:16 #9
Hvis du skal beskytte et netode eller et felt imod at blive brugt uden for en klasse, så skal du erklære det som:

private - så er det kun klassen semv som bø bruge det.
protected - så er det kun klasser som arver fra klassen som må bruge det.
internal - så er det kun andre klasser der ligger inde i samme assembly som må bruge det.

Du beskytter ingen ting med et interface. Pointen med et interface er nærmest den omvendte: At definere et minimum af metoder og properties som en given klasse viser udad til. Ikke til at skjule metoder.
Avatar billede nielle Nybegynder
27. februar 2008 - 20:17 #10
Hvis at du har data på serveren som klienterne ikke skal have, så er den bedste sikkerhed imidlertid at lade være med at sende dem til klienten.
Avatar billede arne_v Ekspert
27. februar 2008 - 20:39 #11
Normal accessability virker kun hvis de 2 forskellige consumere er i forskellig kategori.

Hvis ikke saa er en koorperativ loesning med 2 forskellige interfaces en praktisk loesning.

Alternativet (hvis vi antager at de 2 consumere er i forskellige assemblies, men det
lyder sandsynligt) er at give dem internal acccess og saa bruge InternalsVisibleToAttribute
til at styre adgangen. Men det synes jeg ikke er en paen loesning.
Avatar billede Slettet bruger
27. februar 2008 - 20:44 #12
men hvis jeg har en List<> med mit object, kan jeg så ikke lave en anden klasse der kun har de ting som klienten må se, og så konvertere det til det object?

F.eks:

class User
{
    public string Username;
    Public string Password;
}

class LimitedUser
{
    public string Username;
}

User U = new User();
LimitedUser LU = (LimitedUser)U;

Og derved overfører værdierne?
Avatar billede nielle Nybegynder
27. februar 2008 - 20:54 #13
I det der tilfælde er der intet som forhindre dem i at caste tilbage til User-klassen.
Avatar billede arne_v Ekspert
27. februar 2008 - 21:18 #14
Du kan ikke caste paa den maade.

Men du kan godt returnere dem noget som de kun kender som et interface med de properties
de har lov til at se.
Avatar billede arne_v Ekspert
27. februar 2008 - 21:19 #15
Loesningen er koorperativ i den forstand at consumer kan caste til original typen.

Bemaerk at bruge af accessability kan ogsaa omgaaes ved brug af reflection.
Avatar billede bvli Praktikant
28. februar 2008 - 12:00 #16
... Hvis altså consumer har _adgang_ til originaltypen.

Jeg forstod på trådstarter, at der var tale om en remoting-løsning. Reelt vil det være muligt at implementere med en soap-formatter i stedet for en binær-formatter. I det tilfælde vil det være muligt at generere en clien-class og en server-class, som kun kommunikerer vha. soap. Og altså, sender serveren kun de data til klienten, som klienten må se.

/B :)
Avatar billede nielle Nybegynder
10. marts 2008 - 18:30 #17
Har du fået svar på dine spørgsmål?
Avatar billede Slettet bruger
12. marts 2008 - 21:30 #18
læg et svar dem der føler sig beretiget til det, jeg kunne ikke bruge det til så meget :)
Avatar billede nielle Nybegynder
12. marts 2008 - 22:13 #19
Jamen så har du jo åbenbart ikke fået svar på dit spørgsmål.

Det kan vi jo ikke vide hvis du ikke spørger ind til det vi skriver. Så spørg.
Avatar billede Slettet bruger
15. marts 2008 - 20:52 #20
Jeg løste det ved at lærer hvordan man brugte klasse arving :-)

Det tog lige lidt tid at sætte mig ind i hvordan det skulle fungere med protected properties osv, men dete r sgu meget nyttigt..

Hvis nogen vil have point så smid et svar, tak for hjælpen
Avatar billede arne_v Ekspert
16. marts 2008 - 00:19 #21
ok
Avatar billede arne_v Ekspert
16. marts 2008 - 19:32 #22
Der skulle ikke have været delt her ?
Avatar billede Slettet bruger
16. marts 2008 - 22:15 #23
hva mener du?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester