|
|
(не показано 10 промежуточных версий этого же участника) |
Строка 1: |
Строка 1: |
| =Не редактировать. Статья в работе=
| | Обсуждаемые далее механизмы наследования включают понятие "правила видимости". |
| В VIP: | | В вульгарной интерпретации под правилом видимости мы понимаем возможность обращения к базовым элементам языка (константам, доменам, предикатам, клаузам и фактам) одной сущности из какой-либо другой сущности. Сущностями являются в данном случае классы и объекты. |
| 1. Правила видимости существуют, но нет ни одного ключевого слова для их обозначения, то есть и ключевое слово protected тоже исчезло. В VIP все правила видимости определяются местом декларации сущности.
| |
|
| |
|
| 2. Понятие АBSTACT CLASS не используется, его заменила более гибкая конструкция Interface
| | '''''Примечание.''''' К правилам видимости мы не относим вопросы включения текстов интерфейсов, классов и имплементаций в соответствующие файлы проекта. Такие коллизии включения должны быть разрешены корректно с использованием директив ''include'' в файлах проекта *.pack и *.ph. |
|
| |
|
| 3. Ключевое слово STATIC не используется, его аналогом являются конструкции class predicates и class facts.
| | Обычно, говоря о Visual Prolog, подчеркивают, что это - типизированный язык. Это подразумевает, что существует объявление (или декларация) типов данных, используемых в предикатах в качестве входных или выходных параметров. Это объявление используется затем в клаузе - исполняемой части предиката, где и интерпретируется как программистом, так и компилятором. |
|
| |
|
| 4. Имя интерфейса является также и именем домена, что дает возможность взаимных преобразований интерфейсов по общим правилам преобразования доменов (семантически допустимым, естественно).
| | Например, в следущем коде |
| | | <vip> |
| Сразу подчеркну, что факты подчиняются только правилу видимости private. Это сделано намеренно.
| |
| | |
| а вот пример действия правила protected
| |
| | |
| | |
| Код
| |
| class parent:parent
| |
| end class
| |
| | |
| interface parent
| |
| predicates | | predicates |
| helloWorldFromParent:(string Text).
| | выделитьИзФайлаОтрезокТекстаСЗаданнойДлиной:(string FileName, unsigned ЧислоСимоволов) ->string |
| | | clauses |
| end interface parent
| | выделитьИзФайлаОтрезокТекстаСЗаданнойДлиной(ИмяФайла,ЧислоСимоволов)=ОтрезокТекста:- |
| | | ПолныйТекстФайла=прочитатьФайл(ИмяФайла), |
| implement parent
| | ... |
| clauses
| | </vip> |
| helloWorldFromParent(Text):-
| | декларация (раздел predicates) и клауза (раздел clauses) помещаются рядом по тексту. Но это лишь частный случай возможного их взаимного размещения. Местом помещения исполнительной части '''всегда''' является имплементация класса (implement ... end implement). Местами помещения декларации могут быть: |
| write(Text). | | *декларация класса (class ... end class) |
| | | *декларация интерфейса (interface ... end interface) |
| end implement parent
| | *имплементация класса (implement ... end implement) |
| | |
| | |
| class child:child
| |
| end class
| |
| | |
| interface child
| |
| helloWorldFromChild:(string Text).
| |
| | |
| end interface child
| |
| | |
| | |
| implement child
| |
| inherits parent
| |
| | |
| clauses
| |
| helloWorldFromChild(Text):- | |
| write(Text).
| |
| | |
| end implement child
| |
| | |
| | |
| | |
| Здесь
| |
| | |
| helloWorldFromChild(...) - подчиняется правилу public
| |
| а на
| |
| helloWorldFromParent(...) - действует правило protected.
| |
| | |
| У объекта класса child можно вызвать только предикат
| |
| helloWorldFromChild(...), а из объекта класса child можно обратиться как к предикату
| |
| helloWorldFromChild(...), так и к предикату helloWorldFromParent(...).
| |
| | |
| | |
| Цитата
| |
| А что вы имели ввиду под словосочетанием "более гибкая". Вы имели ввиду это? :
| |
| | |
| Цитата
| |
| Имя интерфейса является также и именем домена
| |
| | |
| | |
| Да, операции преобразования интерфейсов являются одной из составляющих гибкости.
| |
| | |
| объединение предикатов нескольких интерфейсов или подмена одного интерфейса другим легко делается с помощью объявления supports, например,
| |
| | |
| | |
| Код
| |
| interface myInterface
| |
| supports myInterface1
| |
| supports myInterface2
| |
| end interface myInterface
| |
| | |
| | |
| Если у Вас есть интерфейсы myInterface1 и myInterface2, то через myInterface можно оперировать предикатами из myInterface1 и myInterface2 как предикатами одного интерфейса. В добавок myInterface тоже может иметь свой список объявлений предикатов.
| |
| | |
| Кроме того есть такие возможности, как
| |
| delegate interface - когда можно передать исполнение предикатов интерфейса объекту, хранящемуся в факте-переменной.
| |
| | |
| Возможно перекрывать имплементацию предиката(ов) родительского класса имплементацией предиката(ов) дочернего класса, например, родителький класс содержит имплементацию "по умолчанию", а ряд конкретных классов должен реагировать на вызов предикатов особенным образом.
| |
| | |
| Клаузы для предикаты одного интерфейса могут содержаться в имлементациях разных классов путем использования конструкции
| |
| predicates from ...
| |
| | |
| То есть интерфейс есть фасадная часть класса (динамического), а механизмы имплементации могут быть самыми разными.
| |
| | |
| Я думаю здесь та же история, что и с типизацией в Turbo, PDC и Visual Прологах: технически оправдано и практически ведет к повышению надежности программ.
| |
| | |
| 1. Ни классы, ни интерфейсы не имеют никаких предопределенных предикатов (кроме конструкторов, относящихся только к декларации класса), а видимость фактов предполагает операции над ними и, cоответственно, наличие предопределенных предикатов.
| |
| 2. Причина дисциплинарного характера - выполнять операции над фактами только через соответствующие предикаты. Глобальные данные должны храниться в объекте, о котором должны знать те, кому положено.
| |
| | |
| Учитывая 2, не стали бороться с 1.
| |
| | |
| | |
| Цитата
| |
| В обьявлении класса указываются ТОЛЬКО интерфейс (притом один)
| |
| | |
| да, один. Если интерфейс не указывается, то класс является статическим, то есть не способен порождать объекты.
| |
| | |
| | |
| Цитата
| |
| а вот наследование методов происходит только в имплементах. Или я не угадал?
| |
| | |
| Может и угадали, если понимаете глубже.
| |
| В имплементации происходит наследование классов (точнее - объектов-экземпляров этих классов), а вот наследуются методы или нет - это определяется интерфейсами, которые эти классы поддерживают. Кроме того, предикаты, объявленные внутри имплементации видны только изнутри только этой имплементации.
| |
| | |
| Ниже я переименовал классы и интерфейсы, чтобы было яснее где что.
| |
| | |
| | |
| Код
| |
| class parentClass:parentInterface
| |
| end class parentClass | |
| | |
| interface parentInterface
| |
| predicates
| |
| publicPredicate:().
| |
| end interface parentInterface
| |
| | |
| implement parentClass
| |
| clauses
| |
| publicPredicate():-
| |
| write("").
| |
| predicates
| |
| privatePredicate:().
| |
| clauses
| |
| privatePredicate():-
| |
| write("TTT").
| |
| end implement parentClass
| |
| | |
| class childClass:childInterface
| |
| end class childClass
| |
| | |
| implement childClass
| |
| inherits parentClass
| |
| end implement childClass
| |
| | |
| interface childInterface
| |
| end interface childInterface | |
| | |
| | |
| publicPredicate() доступен из класса childClass,а
| |
| privatePredicate недоступен для использования нигде,
| |
| кроме как в самом классе parentClass.
| |
| | |
| | |
| Цитата
| |
| Коль, обьявления класса основывается на интерфейсах и описывается в декларативной части, а реализация наследуется и описывается в имплементной, то можно предположить, что можно, в принципе, заинтерфейснить от одного, а заинхеритить от другого, никак (даже далеко) не связанного с данным интерфейсом класса, лиш бы в итоге все методы с полями интерфейса были реализованны. Или не так?
| |
| | |
| Выражение "...'заинтерфейсить' от одного, а 'заинхеритить' от другого..." - без указания сущности использует не рядоположенные понятия, в первом случае - интерфейс, во втором-класс.
| |
| | |
| Лучше смотреть с такой позиции:
| |
| a) Интерфейс никак не зависит от класса - это именованный набор предикатов и/или доменов и/или констант.
| |
| | |
| B) Класс поддерживает некоторый интерфейс (своей имплементацией), если этот интерйес указан в декларации класса.
| |
| | |
| c) Имплементация всегда соответствует классу и имеет с ним одно имя.
| |
| | |
| d) Если класс поддерживает интерфейс, то имплементация должна тем или иным образом привести к клаузу для каждого предиката интерфейса.
| |
| | |
| Поэтому может быть много разных классов , поддерживающих один и тот же интерфейс.
| |
| | |
| | |
| | |
| [[Категория:VipLanguage]]
| |
Обсуждаемые далее механизмы наследования включают понятие "правила видимости".
В вульгарной интерпретации под правилом видимости мы понимаем возможность обращения к базовым элементам языка (константам, доменам, предикатам, клаузам и фактам) одной сущности из какой-либо другой сущности. Сущностями являются в данном случае классы и объекты.
Примечание. К правилам видимости мы не относим вопросы включения текстов интерфейсов, классов и имплементаций в соответствующие файлы проекта. Такие коллизии включения должны быть разрешены корректно с использованием директив include в файлах проекта *.pack и *.ph.
Обычно, говоря о Visual Prolog, подчеркивают, что это - типизированный язык. Это подразумевает, что существует объявление (или декларация) типов данных, используемых в предикатах в качестве входных или выходных параметров. Это объявление используется затем в клаузе - исполняемой части предиката, где и интерпретируется как программистом, так и компилятором.
Например, в следущем коде
predicates
выделитьИзФайлаОтрезокТекстаСЗаданнойДлиной:(string FileName, unsigned ЧислоСимоволов) ->string
clauses
выделитьИзФайлаОтрезокТекстаСЗаданнойДлиной(ИмяФайла,ЧислоСимоволов)=ОтрезокТекста:-
ПолныйТекстФайла=прочитатьФайл(ИмяФайла),
...
декларация (раздел predicates) и клауза (раздел clauses) помещаются рядом по тексту. Но это лишь частный случай возможного их взаимного размещения. Местом помещения исполнительной части всегда является имплементация класса (implement ... end implement). Местами помещения декларации могут быть:
- декларация класса (class ... end class)
- декларация интерфейса (interface ... end interface)
- имплементация класса (implement ... end implement)