14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_cideclare function print(a0:any, a1?:any):string;
174514f5e3Sopenharmony_ci
184514f5e3Sopenharmony_ciclass A {
194514f5e3Sopenharmony_ci    x:number;
204514f5e3Sopenharmony_ci    y:number;
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_ci    constructor(x:number, y:number) {
234514f5e3Sopenharmony_ci        this.x = x;
244514f5e3Sopenharmony_ci        this.y = y;
254514f5e3Sopenharmony_ci    }
264514f5e3Sopenharmony_ci
274514f5e3Sopenharmony_ci    foo() {
284514f5e3Sopenharmony_ci        print("A foo");
294514f5e3Sopenharmony_ci    }
304514f5e3Sopenharmony_ci
314514f5e3Sopenharmony_ci    bar() {
324514f5e3Sopenharmony_ci        print("A bar");
334514f5e3Sopenharmony_ci    }
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ci    get t():string {
364514f5e3Sopenharmony_ci        return this.constructor.name;
374514f5e3Sopenharmony_ci    }
384514f5e3Sopenharmony_ci
394514f5e3Sopenharmony_ci    set t(str:string) {
404514f5e3Sopenharmony_ci        print(str);
414514f5e3Sopenharmony_ci    }
424514f5e3Sopenharmony_ci
434514f5e3Sopenharmony_ci}
444514f5e3Sopenharmony_ci
454514f5e3Sopenharmony_ciclass B extends A {
464514f5e3Sopenharmony_ci    z:string;
474514f5e3Sopenharmony_ci    constructor(x:number, y:number, z:string) {
484514f5e3Sopenharmony_ci        super(x, y);
494514f5e3Sopenharmony_ci        this.z = z;
504514f5e3Sopenharmony_ci    }
514514f5e3Sopenharmony_ci
524514f5e3Sopenharmony_ci    foo() {
534514f5e3Sopenharmony_ci        print("B foo");
544514f5e3Sopenharmony_ci    }
554514f5e3Sopenharmony_ci}
564514f5e3Sopenharmony_ci
574514f5e3Sopenharmony_cifunction testVtable(o:A) {
584514f5e3Sopenharmony_ci    print(o.x);
594514f5e3Sopenharmony_ci    print(o.y);
604514f5e3Sopenharmony_ci    o.foo();
614514f5e3Sopenharmony_ci    o.bar();
624514f5e3Sopenharmony_ci    print("constructor.name:", o.t);
634514f5e3Sopenharmony_ci    o.t = "setter";
644514f5e3Sopenharmony_ci}
654514f5e3Sopenharmony_ci
664514f5e3Sopenharmony_cilet a = new A(1, 2);
674514f5e3Sopenharmony_citestVtable(a);
684514f5e3Sopenharmony_ci
694514f5e3Sopenharmony_cilet b = new B(3, 4, "BBBB");
704514f5e3Sopenharmony_citestVtable(b);
714514f5e3Sopenharmony_ciprint(b.z);
72