comp.lang.ada
 help / color / mirror / Atom feed
* Re: What is a class in Ada ?
  2000-02-12  0:00 What is a class in Ada ? G
@ 2000-02-11  0:00 ` Matthew Heaney
  2000-02-13  0:00   ` Martin Dowie
  2000-02-17  0:00   ` Charles Hixson
  0 siblings, 2 replies; 7+ messages in thread
From: Matthew Heaney @ 2000-02-11  0:00 UTC (permalink / raw)


In article <38A42642.ADC205BD@interact.net.au> , G <gmw@interact.net.au>  
wrote:

> What is a class in Ada ?

There is a slight terminology difference between Ada and other
languages, so you have to be clear when you answer the question.

A type denotes a set of values and a set of operations.  In Ada, such a
type is called "type," and in other languages it's called a "class."

In Ada, a "class" denotes a family of types.  You have the "class of
integer types," and the "class of floating point types."

In Ada, you can say T'Class, which names the family of tagged types that
have T as their ancestor.

This is nice, because it lets you state explicitly whether you're
applying an operation to any type in the class (T'Class) or to just a
specific type (T).

In other languages, as C++ and Java, this lexical distinction is not
possible.


> Does Ada have a "Class" facility in the same sense that C++ or Java have
> such ?

Yes.  A "tagged type" in Ada is equivalent to a "class" in C++ or Java.

Ada also has "abstract data types" which aren't (publicly) tagged, which
support inheritance of operations, but not type extension.


> Tagged records appeared to me at first to be pretty close to the class notion.
> There are problems though because there are no member functions in records -
> they approximate to C/C++ structs (yes ?).

A tagged record is the same as a class in C++ (or Java).

There is a slight difference, however, because in Ada "type" and
"module" are orthogonal language features.  The primitive operations
("member functions") for a tagged type (record) aren't declared in the
record itself.  Rather, they are declared in the same module in which
the record is declared.

The Ada type:

package P is

  type T is tagged record
    I : Integer;
  end record;

  procedure Op (O : in out T);

end P;

is exactly equivalent to the C++ class:

class T {
public:
  int I;
  void Op;
};

(I'm not a C++ programmer, so my little example may not be quite
correct.)


> As I understand it, these are Abstract Data Types - and not in themselves
> dynamic objects.

I don't know what you mean by "dynamic object."

Really they're all abstract data types, it's just that some of them are
tagged (and therefore extensible) and some aren't tagged.  For example:

package P is

  type Nontagged_Type is private;
  procedure Op (O : in out Nontagged_Type);

  type Tagged_Type is tagged private;
  procedure Op (O : in out Tagged_Type);
...
end P;

Really both of these are abstract data types.  The difference shows up
during a derivation:

package P.C is

  type Derives_From_Nontagged_Type is new Nontagged_Type;

  type Derives_From_Tagged_Type is new Tagged_Type with record
    F : Float;
  end record;
...
end P.C;


You're allowed to extend Tagged_Type with a new component (here,
component F of type Float).  It is not possible to extend
Nontagged_Type.

Of course, in both cases, primitive operations are inherited.  Here,
both derived types come with a primitive operation called Op.


> In C++, the definition of a class appears fairly transparent and not much more
> difficult than creating an instance of a record in Ada.  I have not found
> anything in my html tutes or paper books to tell me more about "Objects" in
> Ada.  Yet.

A "class" in C++ is equivalent to a "tagged record" in Ada.

In Ada, an "object" is an instance of any type:

Integer_Object : Integer;
Float_Object : Float;
Object_Whose_Type_Is_Tagged : Tagged_Type;

These are all "objects" in Ada.


> So - are the packages of Ada the class definitions, maybe  ?

Sort of.  It's hard to compare languages here, because in Ada, module
are type are orthogonal, which is not the case in other languages.

The purpose of a package (module) in Ada is to demarcate, from among all
the operations in the universe that take type T as a parameter, those
operations that are "primitive" for the type.

We care about primitiveness, because only primitive operations are
inherited during a derivation.

For example,

package P is

  type T is private;  -- tagged-ness doesn't matter here

  procedure Op1 (O : in out T);
...
end P;

with P;
package Q is

  procedure Op2 (O : in out P.T);

end Q;

Operation P.Op1 is primitive for type T, and therefore it gets inherited
during a derivation.  For example:

package P.C is

  type NT is new T;

end P.C;

Although it's not obvious from the text of package P.C, type NT does
have an operation called Op1, and you can legally do this:

declare
  O : P.C.NT;
begin
  P.C.Op1 (O);
end;

However, operation Q.Op2 is not primitive for type P.T, because it's not
declared in the same package as package in which T is declared (here,
P).  Therefore it is not inherited.

So you can do this:

declare
  O : P.T;
begin
  Q.Op2 (O);
end;

but you cannot do this:

declare
  O : P.C.NT;
begin
  Q.Op2 (O);  -- illegal
end;


> I am still learning, excuse my simplicity.

The only dumb question is the question that doesn't get asked.

Hope that helps some,
Matt
--
Celebrate Darwin Day on Saturday, 12 February!

<http://www.bbc.co.uk/education/darwin/index.shtml>




^ permalink raw reply	[flat|nested] 7+ messages in thread

* What is a class in Ada ?
@ 2000-02-12  0:00 G
  2000-02-11  0:00 ` Matthew Heaney
  0 siblings, 1 reply; 7+ messages in thread
From: G @ 2000-02-12  0:00 UTC (permalink / raw)


What is a class in Ada ?

Does Ada have a "Class" facility in the same sense that C++ or Java have
such ?

Tagged records appeared to me at first to be pretty close to the class
notion.  There are problems though because there are no member functions

in records - they approximate to C/C++ structs (yes ?).  As I understand
it,
these are Abstract Data Types - and not in themselves dynamic objects.
   In C++, the definition
of a class appears fairly transparent and not much more difficult than
creating
an instance of a record in Ada.  I have not found anything in my html
tutes or paper
books to tell me more about "Objects" in Ada.  Yet.

So - are the packages of Ada the class definitions, maybe  ?

I am still learning, excuse my simplicity.

--
G.






^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: What is a class in Ada ?
  2000-02-11  0:00 ` Matthew Heaney
@ 2000-02-13  0:00   ` Martin Dowie
  2000-02-14  0:00     ` Robert A Duff
                       ` (2 more replies)
  2000-02-17  0:00   ` Charles Hixson
  1 sibling, 3 replies; 7+ messages in thread
From: Martin Dowie @ 2000-02-13  0:00 UTC (permalink / raw)


i only know "orthogonal" as meaning 'right-angled' - what do you mean by it in this
context?

Matthew Heaney wrote:

> <snip>
> There is a slight difference, however, because in Ada "type" and
> "module" are orthogonal language features.  The primitive operations
> ("member functions") for a tagged type (record) aren't declared in the
> record itself.  Rather, they are declared in the same module in which
> the record is declared.
>





^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: What is a class in Ada ?
  2000-02-13  0:00   ` Martin Dowie
  2000-02-14  0:00     ` Robert A Duff
@ 2000-02-14  0:00     ` Larry Kilgallen
  2000-02-14  0:00     ` Gautier
  2 siblings, 0 replies; 7+ messages in thread
From: Larry Kilgallen @ 2000-02-14  0:00 UTC (permalink / raw)


In article <38A6CB7E.F1A1CCEC@dowie-cs.demon.co.uk>, Martin Dowie <martin@dowie-cs.demon.co.uk> writes:

I know "orthogonal" as standing for entirely unrelated systems of
classification.  By example, absent proof the the contrary, I would guess:

	The political parties to which people belong is orthogonal
		to whether they are right or left handed

	The programming language people prefer is orthogonal to
		the color of their hair.

etc.

Larry Kilgallen

> i only know "orthogonal" as meaning 'right-angled' - what do you mean by it in this
> context?
> 
> Matthew Heaney wrote:
> 
>> <snip>
>> There is a slight difference, however, because in Ada "type" and
>> "module" are orthogonal language features.  The primitive operations
>> ("member functions") for a tagged type (record) aren't declared in the
>> record itself.  Rather, they are declared in the same module in which
>> the record is declared.
>>
> 




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: What is a class in Ada ?
  2000-02-13  0:00   ` Martin Dowie
  2000-02-14  0:00     ` Robert A Duff
  2000-02-14  0:00     ` Larry Kilgallen
@ 2000-02-14  0:00     ` Gautier
  2 siblings, 0 replies; 7+ messages in thread
From: Gautier @ 2000-02-14  0:00 UTC (permalink / raw)


Martin Dowie wrote:

> i only know "orthogonal" as meaning 'right-angled' - what do you mean by it in this
> context?

Not only (the features) are indepependent but they also don't project
a shadow on each other... ;-) G.




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: What is a class in Ada ?
  2000-02-13  0:00   ` Martin Dowie
@ 2000-02-14  0:00     ` Robert A Duff
  2000-02-14  0:00     ` Larry Kilgallen
  2000-02-14  0:00     ` Gautier
  2 siblings, 0 replies; 7+ messages in thread
From: Robert A Duff @ 2000-02-14  0:00 UTC (permalink / raw)


Martin Dowie <martin@dowie-cs.demon.co.uk> writes:

> i only know "orthogonal" as meaning 'right-angled' - what do you mean by it in this
> context?

Think of each "feature" as a dimension in a multidimensional cartesian
coordinate system.  If features are orthogonal, they can be combined in
the same sense that the X, Y, Z... coordinates can be defined to define
a point.

- Bob




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: What is a class in Ada ?
  2000-02-11  0:00 ` Matthew Heaney
  2000-02-13  0:00   ` Martin Dowie
@ 2000-02-17  0:00   ` Charles Hixson
  1 sibling, 0 replies; 7+ messages in thread
From: Charles Hixson @ 2000-02-17  0:00 UTC (permalink / raw)


Thank you!
That's the best explanation of a class in Ada that I've run across.  The only thing
that feels left out is that in Ada there is never a presumption that the first
argument of a function is the class "Of which it is the method", as methods are
allowed to be defined separately.  This makes the language more flexible at the cost
of being a bit more verbose.

Thus methods are "owned" by modules, not by classes.  Different modules can use the
same method name in different ways, as in Java or C++ different classes can use the
same method name in different ways.  I believe, but I've never tested, that within
one module the same name can be used in different ways **PROVIDED ** the argument
list differs in the types of its arguments.
E.g.:

Package P is
function   random  return float;
function   random (min : Integer; max : Integer)   return Integer;
end P;


Matthew Heaney wrote:

> In article <38A42642.ADC205BD@interact.net.au> , G <gmw@interact.net.au>
> wrote:
>
> > What is a class in Ada ?
>
> There is a slight terminology difference between Ada and other
> languages, so you have to be clear when you answer the question.
>
> A type denotes a set of values and a set of operations.  In Ada, such a
> type is called "type," and in other languages it's called a "class."
>
> In Ada, a "class" denotes a family of types.  You have the "class of
> integer types," and the "class of floating point types."
>
> In Ada, you can say T'Class, which names the family of tagged types that
> have T as their ancestor.
>
> This is nice, because it lets you state explicitly whether you're
> applying an operation to any type in the class (T'Class) or to just a
> specific type (T).
>
> In other languages, as C++ and Java, this lexical distinction is not
> possible.
>
> > Does Ada have a "Class" facility in the same sense that C++ or Java have
> > such ?
>
> Yes.  A "tagged type" in Ada is equivalent to a "class" in C++ or Java.
>
> Ada also has "abstract data types" which aren't (publicly) tagged, which
> support inheritance of operations, but not type extension.
>
> > Tagged records appeared to me at first to be pretty close to the class notion.
> > There are problems though because there are no member functions in records -
> > they approximate to C/C++ structs (yes ?).
>
> A tagged record is the same as a class in C++ (or Java).
>
> There is a slight difference, however, because in Ada "type" and
> "module" are orthogonal language features.  The primitive operations
> ("member functions") for a tagged type (record) aren't declared in the
> record itself.  Rather, they are declared in the same module in which
> the record is declared.
>
> The Ada type:
>
> package P is
>
>   type T is tagged record
>     I : Integer;
>   end record;
>
>   procedure Op (O : in out T);
>
> end P;
>
> is exactly equivalent to the C++ class:
>
> class T {
> public:
>   int I;
>   void Op;
> };
>
> (I'm not a C++ programmer, so my little example may not be quite
> correct.)
>
> > As I understand it, these are Abstract Data Types - and not in themselves
> > dynamic objects.
>
> I don't know what you mean by "dynamic object."
>
> Really they're all abstract data types, it's just that some of them are
> tagged (and therefore extensible) and some aren't tagged.  For example:
>
> package P is
>
>   type Nontagged_Type is private;
>   procedure Op (O : in out Nontagged_Type);
>
>   type Tagged_Type is tagged private;
>   procedure Op (O : in out Tagged_Type);
> ...
> end P;
>
> Really both of these are abstract data types.  The difference shows up
> during a derivation:
>
> package P.C is
>
>   type Derives_From_Nontagged_Type is new Nontagged_Type;
>
>   type Derives_From_Tagged_Type is new Tagged_Type with record
>     F : Float;
>   end record;
> ...
> end P.C;
>
> You're allowed to extend Tagged_Type with a new component (here,
> component F of type Float).  It is not possible to extend
> Nontagged_Type.
>
> Of course, in both cases, primitive operations are inherited.  Here,
> both derived types come with a primitive operation called Op.
>
> > In C++, the definition of a class appears fairly transparent and not much more
> > difficult than creating an instance of a record in Ada.  I have not found
> > anything in my html tutes or paper books to tell me more about "Objects" in
> > Ada.  Yet.
>
> A "class" in C++ is equivalent to a "tagged record" in Ada.
>
> In Ada, an "object" is an instance of any type:
>
> Integer_Object : Integer;
> Float_Object : Float;
> Object_Whose_Type_Is_Tagged : Tagged_Type;
>
> These are all "objects" in Ada.
>
> > So - are the packages of Ada the class definitions, maybe  ?
>
> Sort of.  It's hard to compare languages here, because in Ada, module
> are type are orthogonal, which is not the case in other languages.
>
> The purpose of a package (module) in Ada is to demarcate, from among all
> the operations in the universe that take type T as a parameter, those
> operations that are "primitive" for the type.
>
> We care about primitiveness, because only primitive operations are
> inherited during a derivation.
>
> For example,
>
> package P is
>
>   type T is private;  -- tagged-ness doesn't matter here
>
>   procedure Op1 (O : in out T);
> ...
> end P;
>
> with P;
> package Q is
>
>   procedure Op2 (O : in out P.T);
>
> end Q;
>
> Operation P.Op1 is primitive for type T, and therefore it gets inherited
> during a derivation.  For example:
>
> package P.C is
>
>   type NT is new T;
>
> end P.C;
>
> Although it's not obvious from the text of package P.C, type NT does
> have an operation called Op1, and you can legally do this:
>
> declare
>   O : P.C.NT;
> begin
>   P.C.Op1 (O);
> end;
>
> However, operation Q.Op2 is not primitive for type P.T, because it's not
> declared in the same package as package in which T is declared (here,
> P).  Therefore it is not inherited.
>
> So you can do this:
>
> declare
>   O : P.T;
> begin
>   Q.Op2 (O);
> end;
>
> but you cannot do this:
>
> declare
>   O : P.C.NT;
> begin
>   Q.Op2 (O);  -- illegal
> end;
>
> > I am still learning, excuse my simplicity.
>
> The only dumb question is the question that doesn't get asked.
>
> Hope that helps some,
> Matt
> --
> Celebrate Darwin Day on Saturday, 12 February!
>
> <http://www.bbc.co.uk/education/darwin/index.shtml>





^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2000-02-17  0:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-02-12  0:00 What is a class in Ada ? G
2000-02-11  0:00 ` Matthew Heaney
2000-02-13  0:00   ` Martin Dowie
2000-02-14  0:00     ` Robert A Duff
2000-02-14  0:00     ` Larry Kilgallen
2000-02-14  0:00     ` Gautier
2000-02-17  0:00   ` Charles Hixson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox