Skip to content

Модификатор exclusive: наследуется всё, что не запрещено

edited May 2022 in Tutorials

В OverScript наследуются все методы, и видны в производных классах все, а не только public и protected, как в C#. Запрет наследования метода делается модификатором exclusive. Модификатора protected, который делает метод видимым в производных классах, в OverScript нет. Применять exclusive можно только к методам, а к переменным (полям) пока нельзя.

Допустим, мы хотим исключить метод класса-родителя из производного класса:

Bar b=new Bar();
b.Test2(); //Test2 at Bar
//b.Test(); //ошибка: функция не найдена

class Foo{
    public exclusive Test(){WriteLine("Test at Foo");}
}
class Bar:Foo{
    public Test2(){WriteLine("Test2 at Bar");}
}

Думаю, всё понятно. Теперь пример с конструктором:

new Bar(5L); //New at Bar. А без exclusive было бы: New at Foo (два конструктора было бы, и тот, который с long был бы подходящим).

class Foo{
    exclusive New(long x){
        WriteLine("New at Foo");
    }
}
class Bar:Foo{
    New(int x){
        WriteLine("New at Bar");
    }
}

Конструкторы в OverScript наследуются как обычные методы. Запрет наследования модификатором exclusive может помочь избежать возможных накладок, которые являются одной из причин отсутствия наследования конструкторов в других языках.

В OverScript наследуемые функции компилируются для каждого класса, если не помечены модификатором fixed. В C# не так, а fixed имеет другое назначение. Приведу пример, чем полезно отдельное компилирование функции для каждого класса, где она унаследована:

new Bar().Test(); //555

class Foo{
    public Test(){WriteLine(GetNum());}
    int GetNum(){return 123;}
}

class Bar:Foo{
    int GetNum(){return 555;}
}

Теперь в Bar есть своя GetNum(), и Test() из Foo будет вызывать именно её. В C# пришлось бы сделать GetNum() виртуальной, а вызов виртуальных методов происходит значительно дольше обычных. В Python поведение как в OverScript, т.е. функции родительского класса вызывают перекрывающие функции из производного.

Sign In or Register to comment.