Κυριακή, 3 Ιανουαρίου 2016

Συναρτήσεις που επιστρέφουν αντικείμενα

Στο παράδειγμα εδώ (και στις δυο γλώσσες, Ελληνικά και Αγγλικά), χρησιμοποιούμε δυο διαφορετικά αντικείμενα το Αριθ και το Προσθ που έχουν ένα κοινό αντικείμενο το Μια_Τιμή ως βάση. Ουσιαστικά τα Αριθ και Προσθ είναι συναρτήσεις που γυρνάνε ένα αντικείμενο Μια_Τιμή.

Ο κώδικας είναι πολύ απλός, διότι η Μ2000 δεν κοιτάει από την αρχή αν το αντικείμενο που θα περάσουμε έχει την ιδιότητα η_τιμή. Αν δεν την έχει θα βγει λάθος! Σε γλώσσες όπως η C++ αυτό δεν επιτρέπεται. Πρέπει δηλαδή να έχει διευκρινιστεί στην ετοιμασία του εκτελέσιμου αρχείου, αν γίνεται αυτό που ζητάμε.




Κλάση Γενική Μια_Τιμή {
      η_τιμή=0
}
Συνάρτηση Αριθ {
             Α=Μια_Τιμή()
             Διάβασε Α.η_τιμή
             =Α
}
Συνάρτηση Προσθ {
      Α=Μια_Τιμή()
      Διάβασε Β,Γ
      Α.η_τιμή=Β.η_τιμή+Γ.η_τιμή
      =Α
}
Α=Αριθ(3.14)
Β=Αριθ(2.72)
Γ=Αριθ(1.00)
Προσθ_ΑΒ=Προσθ(Α,Β)
Προσθ=Προσθ(Προσθ_ΑΒ, Γ)
Τύπωσε Προσθ.η_τιμή



Με αναφορά

Κλάση Γενική Μια_Τιμή {
      η_τιμή=0
}
Συνάρτηση Αριθ {
             Α=Μια_Τιμή()
             Διάβασε Α.η_τιμή
             =Α
}
Συνάρτηση Προσθ {
      Α=Μια_Τιμή()
      Διάβασε,
      Α.η_τιμή=Β.η_τιμή+Γ.η_τιμή
      =Α
}
Α=Αριθ(3.14)
Β=Αριθ(2.72)
Γ=Αριθ(1.00)
Προσθ_ΑΒ=Προσθ(&Α,&Β)
Προσθ=Προσθ(&Προσθ_ΑΒ, &Γ)
Τύπωσε Προσθ.η_τιμή


Στα αγγλικά:

Class Global Expression {
      value=0
}
Function Num {
             A=Expression()
             Read A.value
             =A
}
Function Sum {
      A=Expression()
      Read B,C
      A.value=B.value+C.value
      =A
}
A=Num(3.14)
B=Num(2.72)
C=Num(1.00)
SUM_AB=Sum(A,B)
SUM=sum(SUM_AB, C)
Print SUM.value



Με αναφορά στην Sum

Class Global Expression {
      value=0
}
Function Num {
             A=Expression()
             Read A.value
             =A
}
Function Sum {
      A=Expression()
      Read &B,&C
      A.value=B.value+C.value
      =A
}
A=Num(3.14)
B=Num(2.72)
C=Num(1.00)
SUM_AB=Sum(&A,&B)
SUM=sum(&SUM_AB, &C)
Print SUM.value


Δείτε εδώ πώς γράφεται το πρόγραμμα που έχει την ίδια έξοδο (το ίδιο νούμερο δηλαδή), σε C++, με χρήση Virtual Method. (το έχω αντιγράψει εδώ...μήπως και σβηστεί από την αρχική θέση)

Σε C++

#include <iostream>
using namespace std;

class Expression
{
public:
    virtual
    auto value() const -> double
        = 0;
};

class Number
    : public Expression
{
private:
    double  number_;

public:
    auto value() const -> double
        override
    { return number_; }

    Number( double const number )
        : Expression()
        , number_( number )
    {}
};

class Sum
    : public Expression
{
private:
    Expression const*   a_;
    Expression const*   b_;

public:
    auto value() const -> double
        override
    { return a_->value() + b_->value(); }    // Dynamic binding, OK!

    Sum( Expression const* const a, Expression const* const b )
        : Expression()
        , a_( a )
        , b_( b )
    {}
};

auto main() -> int
{
    Number const    a( 3.14 );
    Number const    b( 2.72 );
    Number const    c( 1.0 );

    Sum const       sum_ab( &a, &b );
    Sum const       sum( &sum_ab, &c );

    cout << sum.value() << endl;
}