Avatar billede mikkelbm Nybegynder
27. juni 2005 - 12:50 Der er 11 kommentarer og
1 løsning

Tilgå metoder fra en private class

Hej

Jeg kommer fra Java verdenen, og der kan man fra en private class tilgå de metoder som ligger i den ydre klasse. Dette kan man ikke i .NET (uden at skulle have en instans af ydre klassen)

- Nogen der kan give en god forklaring på det?
Avatar billede cms Nybegynder
27. juni 2005 - 19:28 #1
Når du snakker om "ydre" og "indre" klasser mener du så non-nestede og nestede klasser?
Man kan sagtens tilgå en metode/property/field i den omsluttende klasse uden at have en instans. Så skal det selvfølgelig bare være en statisk metode/property/field.

using System;

class Nonnested
{
  private static void Hey()
  {
    Console.Write("Hey - jeg er statisk\n");
  }

  private void Heyzan()
  {
    Console.Write("Heyzan - jeg er ikke statisk\n");
  }

  public class Nested
  {
    public void G()
    {
      Hey();      // ok

      Nonnested d = new Nonnested();
      d.Heyzan();      // ok
    }
  }
}

class Test
{
  static void Main()
  {
    Nonnested.Nested n = new Nonnested.Nested();
    n.G();
  }
}
Avatar billede cms Nybegynder
27. juni 2005 - 19:30 #2
Avatar billede mikkelbm Nybegynder
27. juni 2005 - 19:57 #3
Ja, men jeg ønsker ikke at metoderne skal være statiske. Jeg spurgte også efter en forklaring på hvordan det kunne være at man ikke kunne gøre det. Jeg mangler en god grund til at det ikke skulle kunne lade sig gøre uden statiske metoder.
Avatar billede cms Nybegynder
27. juni 2005 - 21:30 #4
Okay...
Det er jo netop definitionen på statiske metoder om man så må sige. Det er derfor man har dem. For at kunne kalde en instance-løs procedure i en klasses scope. Derfor bruger man statiske metoder hvis de ikke kræver noget instance og ikke-statiske hvis de kræver et instance. Hvorfor vil du kalde en instance-specifik metode uden instance? Det giver ikke umiddelbart mening...
Avatar billede cms Nybegynder
27. juni 2005 - 22:07 #5
Hov - nu faldt 10-øren. Undskyld hvis du føler jeg har spammet dit spørgsmål :-/
Det du vil er noget nær nedenstående, ik?

[java]:

public class alpha {
  public int foo;

  public class bravo {
    public void blah() {
      print (foo);
    }
  }

}
//...
alpha x = new alpha();
x.foo = 123;
x.bravo z = new x.bravo();
z.blah();

Forklaring: For at den indre klasse har en implicit reference til sin enclosing instance, må den indre klasse nødvendigvis instantieres gennem denne reference - ergo kaldes "new x.bravo();" i stedet for "new alpha.bravo();".

Her kommer forskellen jo så frem. For det kan ikke lade sig gøre / er ikke tilladt, i c# at instantiere på denne måde - "new x.bravo();" - hvilket er nødvendigt for at bravo kan have en enclosing instance reference.

Men så er det nye spørgsmål selvfølgelig: Hvorfor har de ikke blot medtaget denne skrivemåde i C#?
Der er så vidt jeg ser to mulige svar:
1. De synes det gav for kompleks/dårlig/grim/for svært læsbar/el.lign. kode af en eller anden grund, så de har udeladt muligheden. Ligesom med flere andre java-funktioner.
2. Det ville konflikte med den øvrige sprogstruktur / den måde compileren er skruet sammen på.

Igen undskyld for den første misforståelse :-)
Avatar billede cms Nybegynder
27. juni 2005 - 22:15 #6
En stor del af mig selv tror på svar nummer 1, hvor meget du så end kan bruge det til :) Anyway - se for eksempel følgende kode - som handler om noget lidt andet:
http://www.javacamp.org/javavscsharp/static.html

Kig på det første eksempel i hhv. java og c#, hvor det illustreres at man i C# ikke (som i java) har adgang til et statisk klassemedlem vha. en instance-reference, men man *skal* bruge typenavnet.
Her er det jo rimeligt let at se, at der alene er tale om en simplificering/forskønning af sproget, og ikke hensynstagen til compileren.
Avatar billede mikkelbm Nybegynder
27. juni 2005 - 22:58 #7
Jeg kan godt se idden i det du snakker om, så længe det er en public class. Problemet, synes jeg, er at man ikke fra en private class kan tilgå de ydre metoder. En private class, vil jo som navnet angiver, kun optræde inde i den instans der vil være af en ydre klasse og kan ikke tilgåes udefra. Derfor mener jeg også, at det vil være naturligt, at den kan gøre brug af de ydre metoder.
Avatar billede mikkelbm Nybegynder
27. juni 2005 - 22:59 #8
idden = ideen
Avatar billede mikkelbm Nybegynder
27. juni 2005 - 23:32 #9
Eller...

Det er jo egentlig lige meget om den indre klasse er public eller private. Under alle omstændigheder skal der være oprettet en instans af det ydre objekt, inden man kan oprette instanser af den indre.
Avatar billede mikkelbm Nybegynder
27. juni 2005 - 23:33 #10
Så derfor mener jeg også, at det ville være naturligt at kunne tilgå de ydre metoder fra en indre klasse.
Avatar billede mikkelbm Nybegynder
29. juni 2005 - 08:14 #11
Der kom ikke det klokkeklare svar, som jeg havde håbet på :) Men det ser ikke ud til, at der er nogen har det.

Så smid et svar, cms.
Avatar billede mikkelbm Nybegynder
03. juli 2005 - 20:10 #12
Jeg lukker her. Hvis du vil ha' point, må du lige sige til.
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