Abstract type: Difference between revisions

Content added Content deleted
(Updated Julia)
(added Caché ObjectScript)
Line 379: Line 379:
};</lang>
};</lang>
Because C++ allows multiple inheritance of classes, no distinction is made between interfaces and abstract classes.
Because C++ allows multiple inheritance of classes, no distinction is made between interfaces and abstract classes.

=={{header|Caché ObjectScript}}==

In Caché, abstract and data type classes cannot be instantiated directly - there must be a 'concrete subclass' that extends them as well as the '%RegisteredObject' class in order to instantiate an object, see example below.

<lang cos>Class Abstract.Class.Shape [ Abstract ]
{
Parameter SHAPE = 1;
Property Name As %String;
Method Description() {}
}

Class Abstract.Class.Square Extends (%RegisteredObject, Shape)
{
Method Description()
{
Write "SHAPE=", ..#SHAPE, !
Write ..%ClassName()_$Case(..%Extends(..%PackageName()_".Shape"), 1: " is a ", : " is not a ")_"shape"
}
}</lang>

Data type classes differ because they cannot contain properties, see example below.

<lang cos>Class Abstract.DataType.Shape [ ClassType = datatype ]
{
Parameter SHAPE = 1;
Method Description() {}
}

Class Abstract.DataType.Square Extends (%RegisteredObject, Shape)
{
Method Description()
{
Write "SHAPE=", ..#SHAPE, !
Write ..%ClassName()_$Case(..%Extends(..%PackageName()_".Shape"), 1: " is a ", : " is not a ")_"shape"
}
}</lang>

Both class types can contain implementation code. Caché allows multiple inheritance of classes, so no distinction is made between abstract classes and interfaces.

{{out|Examples}}
<pre>
USER>Do ##class(Abstract.Class.Square).%New().Description()
SHAPE=1
Square is a shape

USER>Do ##class(Abstract.DataType.Square).%New().Description()
SHAPE=1
Square is a shape
</pre>


=={{header|Clojure}}==
=={{header|Clojure}}==