Matlab: При реализации методов, объявленных абстрактными в суперклассе, почему доступ должен быть открытым? - PullRequest
0 голосов
/ 13 сентября 2018

В Matlab (2017a) подклассы не могут ограничивать доступ к унаследованным методам, которые объявлены абстрактными в абстрактном суперклассе.Почему это не будет разрешено?Небольшой пример:

super.m

classdef (Abstract) super
    methods (Abstract)
        out = fun(obj,in)
    end
end

sub.m

classdef sub < super
    properties
        prop
    end
    methods (Access='private') %remove the access restriction to run without errors
        function out = fun(obj,in)
            out = obj.prop * in;
        end
    end
end

testInheritance.m

instance = sub;

Выполнение testInheritance.m приводит к следующему сообщению об ошибке:

Ошибка при использовании sub Метод 'fun' в классе 'sub' использует права доступа, отличные от его суперкласса 'super'.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Изменение свойств доступа метода, объявленного 'public' в базовом классе, чтобы сделать его недоступным в производном классе (что и пытается сделать ваш код), не разрешено, поскольку это нарушит Принцип замещения Лискова .

Другими словами, изменив метод fun с public на private, клиент не сможет использовать экземпляр sub, как если бы он был экземпляром super.

0 голосов
/ 13 сентября 2018

Они не должны быть публичными, но они должны быть доступны для подкласса и суперкласса, и, как говорится в сообщении об ошибке, они должны быть одинаковыми. Итак, у вас есть 2 вопроса:

  1. Метод вашего суперкласса является общедоступным, а метод вашего подкласса - приватным
  2. Вы не можете просто установить метод суперкласса на private, или у подкласса его нет.

Вы хотите установить Access = protected, что означает, что только суперкласс и подклассы имеют видимость функции, поэтому они имеют одинаковые права доступа, могут задавать свое поведение и функция скрыта от других объектов.

Вот опции Access, с определениями из документации :

  • общедоступный - неограниченный доступ
  • защищен - доступ из методов в классе или подклассах
  • private - доступ только по методам класса ( не из подклассов )

Итак, ваши уроки становятся:

classdef (Abstract) super
    methods (Abstract = true, Access = protected)
        out = fun(obj,in)
    end
end

classdef sub < super
    properties
        prop
    end
    methods (Access = protected) 
        function out = fun(obj,in)
            out = obj.prop * in;
        end
    end
end

Обратите внимание, что синтаксис Access = protected, а не Access = 'protected', как вы показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...