Avatar billede lasse37 Nybegynder
28. juni 2003 - 17:09 Der er 39 kommentarer og
1 løsning

Objektorienteret sprog

Hej,

Er der nogen her som kan uddybe for mig hvad et godt objektorienteret programmeringssprog bør indeholde?
Avatar billede arne_v Ekspert
28. juni 2003 - 17:15 #1
Det var et "stort" spørgsmål.

Følgende må være et absolut must:
  * klasse med både data og logik (members og methods)
  * arv mellem klasser

Hvis det skal bruge stil noget fornuftigt så skal man nok også have:
  * virtuelle metoder & polymorfisme
  * rene virtuelle metoder & abstrakte klasser

Men jeg er lidt bange for at du nu har flere spørgsmål end inden jeg svarede.

:-)
Avatar billede lasse37 Nybegynder
28. juni 2003 - 17:26 #2
Hej igen Arne. *S*

Du ved åbenbart alting hva.. *G* Og jo, jeg har en masse spørgsmål parat kan du tro.

Det du skiver vidste jeg egentlig godt, men er der ikke mere i det end det?
Avatar billede arne_v Ekspert
28. juni 2003 - 17:33 #3
Jeg ved absolut ikke alting.

Og der er selvfølgelig flere aspekter. Men når man begynder at gå
lidt mere ned i detaljerne så komemr der jo også forskellige
opfattelser for dagen.

C++ folket mener at multipel arv er godt. Java folket mener det er skidt.

Java folket mener at interfaces er et selvstændigt begreb. C++ folket
mener det bare er en abstrake klase med udelukkende abstrakte metoder.

Mange OO patterns kræver statiske (på klasse fremfor på objekt)
members/metoder. Men jeg ved ikke rigtigt om jeg vil kalde det
en OO feature. Det er en nødvendig feature.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 17:44 #4
Nej, selvfølgelig ved du ikke alting.. Men du ved sq meget om de ting her.

Du skrev fx til mig at man er nødt til at anvende en static i :public void static main().. fordi man ikke havde et objekt af klassen. Hvordan forholder det sig med C++ udgaven? har man da et objekt af klassen når man starter?
Avatar billede arne_v Ekspert
28. juni 2003 - 18:01 #5
C++ bygger jo ovenpå C og det betyder at C++ har en ikke-OO del.

Og i C++ er main en C funktion som er udenfor klasse.

Derfor bare:

int main()

eller

int main(int argc, char *argv[])
Avatar billede arne_v Ekspert
28. juni 2003 - 18:04 #6
Og fordi det er en C funktion, så er det samme funktion
selvom der er forskellig argument liste.

Hvilket naturligt fører til at begreber som method overload
og operator overload også bruges i en del OO sprog (C++ har
begge, mens Java mangler operator overload). Jeg synes dog heller
ikke at det er essentiel OOP bare praktisk.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 18:34 #7
Hvad mener du med at C++ ikke har en oo del? C++ er jo et objekt orienteret sprog. Eller understøtter det i hvert fald.

Man siger at der ikke findes globale variable i Java. Er det også din opfattelse?
Avatar billede arne_v Ekspert
28. juni 2003 - 18:37 #8
Jeg siger at C++ har en ikke-OO del fordi det indeholder stort
set hele sproget C (som er ikke-OO).

"ikke-OO del" != "ikke OO-del"

:-)

C++ har skam en meget omfattende OO-del.

main hører bare hjemme i ikke-OO delen.
Avatar billede arne_v Ekspert
28. juni 2003 - 18:42 #9
Man kan lave en public static variabel i en java klasse. For
alle praktiske formål er det en global variabel.

I C++ kan man lave en static variabel i public delen af en
klasse helt tilsvarende.

Derudover har C++ også arvet "gammeldags" globale variable
fra C.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 18:44 #10
Ja, de kan godt være lidt forvirrende de objekter. *S*

jeg bliver nødt til at vende tilbage til det static. Når man laver variable i Java på denne måde : public static int tal; Hvad er ideen med at lave sådane variabler?
Avatar billede arne_v Ekspert
28. juni 2003 - 18:47 #11
Lad mig lige først lave et minimalistisk eksempel:

public class Z1 {
    public static int v = 123;
}

public class Z2 {
    public static void main(String[] args) {
        System.out.println(Z1.v);
        Z1.v = 456;
        System.out.println(Z1.v);
    }
}
Avatar billede arne_v Ekspert
28. juni 2003 - 18:48 #12
Ideen er at man så har en variabel man kan refere direkte
til fra andre klaser - som en "global variabel".

Og man står til mega store tæsk fra både OO fanatikerne
og Java fanatikerne, fordi man har overtrådt et hav af
regæer om encapsulation, decoupling etc..
Avatar billede arne_v Ekspert
28. juni 2003 - 18:49 #13
Den ægte OO måde at løse det samme problem på er via
en Singleton klasse og passende get/set metoder.
Avatar billede arne_v Ekspert
28. juni 2003 - 18:55 #14
Samme eksempel C (og C++).

z1.c:

int v = 123;

z2.c:

#include <stdio.h>

extern int v;

int main()
{
  printf("%d\n",v);
  v = 456;
  printf("%d\n",v);
}
Avatar billede arne_v Ekspert
28. juni 2003 - 18:56 #15
Samme eksempel C++:

z1.cpp:

class Z1 {
  public:
      static int v;
};

int Z1::v = 123;

z2.cpp:

#include <iostream>

using namespace std;

class Z1 {
  public:
      static int v;
};

int main()
{
  cout << Z1::v << endl;
  Z1::v = 456;
  cout << Z1::v << endl;
}

[og selvfølgelig bør klasse definitionen flyttes ud i en .H fil men ...]
Avatar billede lasse37 Nybegynder
28. juni 2003 - 18:58 #16
AHA! Så der findes altså globale variabler i java. *S* Det var det jeg talte om da jeg sagde at der var forskel på static i java og c++. benytter man flere variabler i samme klasse på den måde, opstår der så ikke et problem mht. til at inatialisere dem?
Avatar billede arne_v Ekspert
28. juni 2003 - 19:01 #17
Hvis du sammenligner Java og C++ eksemplet, så er de vist
meget funktionelt ekvivalente.

Selvom der indrømmet er en del forskel på syntax.
Avatar billede arne_v Ekspert
28. juni 2003 - 19:03 #18
Jeg er ikke helt sikker på hvad d mener med initalisere.

Det kan være et problem at man ikke ved i hvilken rækkefølge
de bliver initialiseret.

Og det er derfor meget farligt at lade en initialisering afhænge af
en anden.

Det problem løses *også* med en singleton, fordi der kan man angive
initialiserings rækkefølgen eksplicit i sin private constructor.
Avatar billede arne_v Ekspert
28. juni 2003 - 19:04 #19
Men jeg tror kun at det er C varianten jeg decideret vil kald ene global
variabel.

C++ og java er public static eller public klasse variabel.

Men de kan bruges til det samme.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 19:06 #20
I c++ er det sådan at klasse metoder indeholder pointeren This som et skjult parameter. Hvorledes forholder det sig i Java? Synes at This i Jave er anderledses.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 19:11 #21
Det her mener jeg med initialiseringen.

class Tal {
 
  private static int værdi;
 
  public Tal( int t ) {
    set( t );
  }
 
  public void set( int t ) {
    værdi = t;
  }
 
  public String toString() {
    return "[Tal: værdi=" + værdi + "]";
  }
}


Her har jeg lavet en traditionel udbygning af Tal, så den fungerer som en integer-wrapper - og dog! værdi er ikke en instansvariabel, men en klassevariabel. 
Følgende testanvendelse viser forskellen: 
class StaticTest {
 
  public static void main( String[] argv ) {
   
    Tal t1 = new Tal( 3 );
    Tal t2 = new Tal( 5 );
   
    System.out.println( t1 );
   
    t2.set( 8 );

    System.out.println( t1 );
  }
}


[Tal: værdi=5]
[Tal: værdi=8]
Avatar billede lasse37 Nybegynder
28. juni 2003 - 19:12 #22
Kan du se det?
Avatar billede arne_v Ekspert
28. juni 2003 - 19:16 #23
Jeg kan godt set det.

Det samme kan du også lave i C++.

Sådan fungerer klasse variabel.

Og man skal ikke bruge dem på den måde.
Avatar billede arne_v Ekspert
28. juni 2003 - 19:17 #24
Umiddelbart vil jeg mene at C++ og Java er rimeligt ens med hensyn
til this.

Men lidt forskelle er der vel.

Hvad tænker du på ?
Avatar billede arne_v Ekspert
28. juni 2003 - 19:23 #25
Følgende eksempler viser en lidt anden bruge af instans og klasse
variable:

public class Tal {
    private static int antal = 0;
    private int no;
    private int tal;

    public Tal(int tal) {
        antal++;
        no = antal;
        this.tal = tal;
    }

    public void setTal(int tal) {
        this.tal = tal;
    }

    public String toString() {
        return "[Tal: værdi=" + tal + ", objekt " + no + " ud af " + antal + "]";
    }
}


public class StaticTest {
    public static void main(String[] argv) {
        Tal t1 = new Tal(3);
        System.out.println(t1);
        Tal t2 = new Tal(5);
        System.out.println(t1);
        System.out.println(t2);
        t2.setTal(8);
        System.out.println(t1);
        System.out.println(t2);
    }
}
Avatar billede lasse37 Nybegynder
28. juni 2003 - 19:24 #26
Jeg tænker på at klasse metoder i C++ indeholder den skjulte pointer THIS, undtaget er dog statiske metoder. Hvordan er det i Java? Ved at man benytter THIS til at initialisere variabler i Java, men hvad med metoder.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 19:35 #27
ja, det er en anderledes måde at gøre det på. Sikkert den rigtige. *G*
Avatar billede arne_v Ekspert
28. juni 2003 - 19:39 #28
this burde være det samme i Java som i C++ også med hensyn til
metoder.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 19:43 #29
Okay..*S*

Jeg har så lige et par enkelte spørgsmål her i slutspurten. Hvor vil du mene at de to sprog egner sig bedst. Altså, hvor er java bedst og hvor er C++ bedst?
Avatar billede arne_v Ekspert
28. juni 2003 - 19:50 #30
Java har et meget større standard API end C++ => mere portabelt.

Java har garbage collection og tillader ikke pointer manipulation => mere
sikkert.

Så medmindre du skal lave noget hvor du kan udnytte nogle af de
ting C++ har som Java mangler som f.eks. templates eller skal lave
noget der ikke kan køre i en JVM (som f.eks. en JVM !), så ville
jeg sige Java.

Eller C# !
Avatar billede jakoba Nybegynder
28. juni 2003 - 20:08 #31
Er C++ OO eller ikke?

Det er et ret væsentligst spørgsmål. og jeg mener ikke, som arne, at vi kan affærdige det med C++ er essentielt sproget C, derfor ikke.

Lad os gå en omvej og kikke på "struktureret programmering":
en if ... else sætning er struktureret og en goto er ikke struktureret.
Men hvis vi kikker på den genererede assemblerkode så bliver den if ... else jo faktisk implementeret ved hjælp af goto sætninger.

Ditto med C++'s objektorienterethed. Den bliver godt nok implementeret ved hjælp af C, men selve sproget C++ hjælper programmøren til at se objektorienteret på probletet og til at programmere det med OO metodik. Så jeg vil kalde C++ for objektorienteret.

C++ er så et nogenlunde tidligt forsøg på at lave et objektorienteret sprog, så det er ikke nær så gennemført i den retning som Java er. Men det er en helt anden sag.

mvh JakobA
Avatar billede arne_v Ekspert
28. juni 2003 - 20:21 #32
jakob>

Hvis jeg ikke har udtrykt mig klart nok: jeg mener absolut at C++ er et OO
sprog.

Det har bare også en lang række ikke-OO features som det har arvet fra C.
Avatar billede jakoba Nybegynder
28. juni 2003 - 20:38 #33
Ja det var jeg også ved at komme frem til efter at have læst tråden ordentligt.
Og er helt enig. undskyld min spam.
Avatar billede arne_v Ekspert
28. juni 2003 - 20:40 #34
Jeg fik udtrykt mig lidt "specielt", da jeg skule forklare
hvorfor man ikke har static på main i C++ ligesom i Java.
Avatar billede lasse37 Nybegynder
28. juni 2003 - 20:41 #35
Det jeg mente var nu at om der er applikationer som er bedst at skrive i Java end C++ fx. eksempelvis hastighed, maskinnær, sikkerhed osv.
Avatar billede arne_v Ekspert
28. juni 2003 - 20:46 #36
C++ vil være en lille smule hurtigere end Java, men ikke ret meget.
Typisk noget i 0-50% området. Forudsat at du bruge nyere JVM's (de
gamle er håbløse med hensyn til performance).

Man kan ikke skrive et maskinnært program i Java. Derfor skal hardware
drivere skrive i f.eks. C++. Og derfor skal f.eks. En JVM også skrives
i f.eks. C++.

Java programmer er betydeligt mere sikre end C++ med hensyn til
at undgå programmerings fejl. Beskyttelse mod hackning og lignende
afhænger mere af program design end sprog (omend Java dog ikke
kan lide af de buffer overflow som C/C++ har haft en del af - gets).
Avatar billede lasse37 Nybegynder
28. juni 2003 - 20:50 #37
Et sidste spørgsmål i denne omgang.. Hvordan har java det med todimensionelle arrays?? int array[4][8];
Avatar billede arne_v Ekspert
28. juni 2003 - 20:52 #38
Det kan du sagtens have.

Men arrays er altid dynamiske i Java - også 2 dim.
Avatar billede arne_v Ekspert
28. juni 2003 - 20:54 #39
Eksempel:

public class Array2D {
    public static void main(String[] args) {
        int[][] a = new int[2][3];
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 3; j++) {
                a[i][j] = i * j;
            }
        }
    }
}
Avatar billede lasse37 Nybegynder
28. juni 2003 - 21:01 #40
Okay, tak.. Du får dine point..

Lars
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
Kurser inden for grundlæggende programmering

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