2016-06-20 5 views
0

Я хотел бы получить metaclass некоторых Matlab встроенных классов, и у меня есть проблемы с @ftp класса: класс рассматривается which, но не система метакласса:метаклассы проблемы с классом FTP

>> which('ftp') 
/usr/local/MATLAB/R2016a/toolbox/matlab/iofun/@ftp/ftp.m % ftp constructor 

но

>> ?ftp 

ans = 

    0x0 class array with properties: 

    Name 
    Description 
    ... 

я получаю тот же результат с пустой meta.class.fromName.

Позвольте мне точное, что другие классы, например @serial класса, которые найдены как which и системы метаклассом:

>> which('serial') 
/usr/local/MATLAB/R2016a/toolbox/matlab/iofun/@serial/serial.m % serial constructor 

и

>> ?serial 

ans = 

    class with properties: 

        Name: 'serial' 
       Description: '' 
         ... 

Почему это так? Это ошибка или функция?

Если это имеет какое-то значение, я запускаю Matlab R2016a на Ubuntu 16.04.

ответ

1

Это потому, что ftp на самом деле является классом старого стиля (использует систему папок @classname в сочетании с конструктором не classdef). В этом стиле, вы имеете следующую структуру файла:

@ftp 
    ftp.m  <--- Constructor (regular m-file, non-classdef) 
    ascii.m  <--- Methods 
    binary.m   | 
    ...     V 
    delete.m 

По сравнению с новым стилем классов (classdef), существует несколько ограничений этих старых классов, включая тот факт, что они не работают с мета-классами ,

Имейте в виду, что если вы пишете классы в старом стиле, следующие функции, доступные в новой структуре, не поддерживаются: защищенные, абстрактные, статические/постоянные, запечатанные или скрытые методы или свойства; определения одного файла; Мероприятия; обрабатывать классы; пакеты; специальный набор и методы получения; Синтаксис object.method(); или метаклассы.

Новый стиль классов (classdef) can still use the @classname class folders с тем исключением, что файл конструктора является теперь classdef файл. Для этих типов классов (например, serial) метаклассы поддерживаются.

+2

Вы правы, что 'ftp' является классом старого стиля, и поэтому он не поддерживает функции метакласса. Но это совершенно отдельный вопрос из-за того, что он использует @-папку. @ -folders являются частью как старых, так и новых классов класса classdef. «serial» совсем не «гибрид», это полностью новый класс стиля, который используется для использования @ -папки. –

+0

Спасибо за этот ясный ответ! – Ratbert

+0

@SamRoberts О, я вижу ваш комментарий к «гибридному» утверждению. Обновлено, чтобы быть немного яснее. Благодаря! – Suever