1- *vim9class.txt* For Vim version 9.1. Last change: 2024 Dec 29
1+ *vim9class.txt* For Vim version 9.1. Last change: 2025 Feb 16
22
33
44 VIM REFERENCE MANUAL by Bram Moolenaar
@@ -52,7 +52,6 @@ An interface is used to specify properties of an object:
5252The class hierarchy allows for single inheritance. Otherwise interfaces are
5353to be used where needed.
5454
55-
5655Class modeling ~
5756
5857You can model classes any way you like. Keep in mind what you are building,
@@ -122,7 +121,6 @@ using the object name followed by a dot following by the member: >
122121A class name cannot be used as an expression. A class name cannot be used in
123122the left-hand-side of an assignment.
124123
125-
126124Object variable write access ~
127125 *read-only-variable*
128126Now try to change an object variable directly: >
@@ -272,6 +270,9 @@ no need to call "super()" or "new()" on the parent.
272270When defining the new() method the return type should not be specified. It
273271always returns an object of the class.
274272
273+ The new() method can be made a protected method by using "_new()". This can
274+ be used to support the singleton design pattern.
275+
275276 *E1386*
276277When invoking an object method, the method name should be preceded by the
277278object variable name. An object method cannot be invoked using the class
@@ -623,13 +624,15 @@ once. They can appear in any order, although this order is recommended: >
623624 extends ClassName
624625 implements InterfaceName, OtherInterface
625626 specifies SomeInterface
626- < *E1355* *E1369*
627+ <
628+ The "specifies" feature is currently not implemented.
629+
630+ *E1355* *E1369*
627631Each variable and method name can be used only once. It is not possible to
628632define a method with the same name and different type of arguments. It is not
629633possible to use a public and protected member variable with the same name. An
630634object variable name used in a super class cannot be reused in a child class.
631635
632-
633636Object Variable Initialization ~
634637
635638If the type of a variable is not explicitly specified in a class, then it is
@@ -686,13 +689,12 @@ A class can implement one or more interfaces. The "implements" keyword can
686689only appear once *E1350* . Multiple interfaces can be specified, separated by
687690commas. Each interface name can appear only once. *E1351*
688691
689-
690692A class defining an interface ~
691693 *specifies*
692694A class can declare its interface, the object variables and methods, with a
693695named interface. This avoids the need for separately specifying the
694696interface, which is often done in many languages, especially Java.
695-
697+ TODO: This is currently not implemented.
696698
697699Items in a class ~
698700 *E1318* *E1325* *E1388*
@@ -733,25 +735,25 @@ Some of the builtin functions like |empty()|, |len()| and |string()| can be
733735used with an object. An object can implement a method with the same name as
734736these builtin functions to return an object-specific value.
735737
736- *E1412*
738+ *E1412*
737739The following builtin methods are supported:
738- *object-empty()*
740+ *object-empty()*
739741 empty() Invoked by the | empty() | function to check whether an object is
740742 empty. If this method is missing, then true is returned. This
741743 method should not accept any arguments and must return a boolean.
742- *object-len()*
744+ *object-len()*
743745 len() Invoked by the | len() | function to return the length of an
744746 object. If this method is missing in the class, then an error is
745747 given and zero is returned. This method should not accept any
746748 arguments and must return a number.
747- *object-string()*
749+ *object-string()*
748750 string() Invoked by the | string() | function to get a textual
749751 representation of an object. Also used by the | :echo | command
750752 for an object. If this method is missing in the class, then a
751753 built-in default textual representation is used. This method
752754 should not accept any arguments and must return a string.
753755
754- *E1413*
756+ *E1413*
755757A class method cannot be used as a builtin method.
756758
757759Defining an interface ~
@@ -783,7 +785,6 @@ An interface can only be defined in a |Vim9| script file. *E1342*
783785An interface cannot "implement" another interface but it can "extend" another
784786interface. *E1381*
785787
786-
787788null object ~
788789
789790When a variable is declared to have the type of an object, but it is not
@@ -792,7 +793,6 @@ does not know what class was supposed to be used. Vim then cannot check if
792793a variable name is correct and you will get a "Using a null object" error,
793794even when the variable name is invalid. *E1360* *E1362*
794795
795-
796796Default constructor ~
797797 *default-constructor*
798798In case you define a class without a new() method, one will be automatically
@@ -1115,7 +1115,6 @@ For |Vim9| script using the same method name for all constructors seemed like
11151115the right choice, and by calling it new() the relation between the caller and
11161116the method being called is obvious.
11171117
1118-
11191118No overloading of the constructor ~
11201119
11211120In Vim script, both legacy and | Vim9 | script, there is no overloading of
@@ -1136,7 +1135,6 @@ That way multiple constructors with different arguments are possible, while it
11361135is very easy to see which constructor is being used. And the type of
11371136arguments can be properly checked.
11381137
1139-
11401138No overloading of methods ~
11411139
11421140Same reasoning as for the constructor: It is often not obvious what type
@@ -1145,7 +1143,6 @@ actually being called. Better just give the methods a different name, then
11451143type checking will make sure it works as you intended. This rules out
11461144polymorphism, which we don't really need anyway.
11471145
1148-
11491146Single inheritance and interfaces ~
11501147
11511148Some languages support multiple inheritance. Although that can be useful in
@@ -1161,7 +1158,6 @@ it will be checked if that change was also changed. The mechanism to assume a
11611158class implements an interface just because the methods happen to match is
11621159brittle and leads to obscure problems, let's not do that.
11631160
1164-
11651161Using "this.variable" everywhere ~
11661162
11671163The object variables in various programming languages can often be accessed in
@@ -1180,7 +1176,6 @@ variables. Simple and consistent. When looking at the code inside a class
11801176it's also directly clear which variable references are object variables and
11811177which aren't.
11821178
1183-
11841179Using class variables ~
11851180
11861181Using "static variable" to declare a class variable is very common, nothing
@@ -1194,7 +1189,6 @@ the class. This has two problems: The class name can be rather long, taking
11941189up quite a bit of space, and when the class is renamed all these places need
11951190to be changed too.
11961191
1197-
11981192Declaring object and class variables ~
11991193
12001194The main choice is whether to use "var" as with variable declarations.
@@ -1248,7 +1242,6 @@ function declaration syntax for class/object variables and methods. Vim9 also
12481242reuses the general function declaration syntax for methods. So, for the sake
12491243of consistency, we require "var" in these declarations.
12501244
1251-
12521245Using "ClassName.new()" to construct an object ~
12531246
12541247Many languages use the "new" operator to create an object, which is actually
@@ -1312,7 +1305,6 @@ An alternative would have been using the "protected" keyword, just like
13121305"public" changes the access in the other direction. Well, that's just to
13131306reduce the number of keywords.
13141307
1315-
13161308No private object variables ~
13171309
13181310Some languages provide several ways to control access to object variables.
0 commit comments