X-Git-Url: http://nitlanguage.org diff --git a/doc/manual/constructor.md b/doc/manual/constructor.md index 39bfe53..38a32c3 100644 --- a/doc/manual/constructor.md +++ b/doc/manual/constructor.md @@ -27,6 +27,11 @@ assert p.id == "ABC" In subclasses, additional attributes are automatically collected. ~~~ +class Product + var id: String + var description: String + var price: Float +end class Book super Product var author: String @@ -44,6 +49,11 @@ It is used to perform additional systematic tasks. Because the `init` is run at the end of the initialization sequence, initialized attributes are usable in the body. ~~~ +class Product + var id: String + var description: String + var price: Float +end class OverpricedProduct super Product init @@ -52,7 +62,7 @@ class OverpricedProduct end end var op = new OverpricedProduct("ABC", "Bla bla", 15.95) -assert op.price == 159.50 +assert op.price.is_approx(159.50, 0.001) ~~~ @@ -65,6 +75,11 @@ There is three cases for an attributes to not be collected in the `new`. * Attributes introduced in refinement of classes ~~~ +class Product + var id: String + var description: String + var price: Float +end class TaxedProduct super Product var tax_rate = 9.90 @@ -75,7 +90,7 @@ class TaxedProduct end end var tp = new TaxedProduct("ABC", "Bla bla", 15.95) -assert tp.total_price == 17.52905 +assert tp.total_price.is_approx(17.52905, 0.00001) ~~~ Note: The orchestration here is important. In order, the following is executed: @@ -95,6 +110,11 @@ In fact, by default, the setter of an attribute is used as a initializer. `autoinit` is used to register a method as a setter. ~~~ +class Product + var id: String + var description: String + var price: Float +end class FooProduct super Product fun set_xy(x, y: Int) is autoinit do z = x * 10 + y @@ -113,6 +133,32 @@ In most case, there is no reason that an argument of a `new` construction is not As explained above, one of the main advantage of these constructors is their compatibility with multiple inheritance. ~~~ +class Product + var id: String + var description: String + var price: Float +end +class OverpricedProduct + super Product + init + do + price = price * 10.0 + end +end +class TaxedProduct + super Product + var tax_rate = 9.90 + var total_price: Float is noinit + init + do + total_price = price * (1.0 + tax_rate/100.0) + end +end +class FooProduct + super Product + fun set_xy(x, y: Int) is autoinit do z = x * 10 + y + var z: Int is noinit +end class MultiProduct super OverpricedProduct super TaxedProduct @@ -120,8 +166,8 @@ class MultiProduct end var mp = new MultiProduct("ABC", "Bla bla", 15.96, 1, 3) assert mp.id == "ABC" -assert mp.price == 159.6 -assert mp.total_price == 175.4 +assert mp.price.is_approx(159.6, 0.001) +assert mp.total_price.is_approx(175.4, 0.001) assert mp.z == 13 ~~~ @@ -151,11 +197,11 @@ class Point redef fun to_s do return "({x},{y})" end var p1 = new Point(1.0, 2.0) -assert p1.to_s == "(1,2)" +assert p1.to_s == "(1.0,2.0)" var p2 = new Point.origin -assert p2.to_s == "(0,0)" +assert p2.to_s == "(0.0,0.0)" var p3 = new Point.polar(1.0, 2.0) -assert p3.to_s == "(-0.4161,0.9092)" +assert p3.to_s == "(-0.416,0.909)" ~~~