2011-12-25 2 views
17

Есть ли способ иметь две функции с тем же именем, но с разными аргументами внутри одного класса в Matlab?Функции перегрузки

+0

Связанных/Возможные дубликатов: (http://stackoverflow.com/q/ [Как перегрузить определенный пользователь функцию в Matlab?] 7217653/52738), [возможно перегрузить функцию в классе matlab?] (Http://stackoverflow.com/q/8087155/52738) – gnovice

ответ

21

Вкратце: Нет, это невозможно.

Однако, Вы можете имитировать такое поведение:

Очевидно, что поскольку Matlab является динамическим языком, вы можете передать аргументы любого типа и проверить их.

function foo(x) 
    if isnumeric(x) 
     disp(' Numeric behavior'); 
    elseif ischar(x) 
     disp(' String behavior'); 
    end 
end 

Вы также можете использовать varargin и проверьте количество параметров, а также изменить поведение

function goo(varargin) 
    if nargin == 2 
     disp('2 arguments behavior'); 
    elseif nargin == 3 
     disp('3 arguments behavior'); 
    end 
end 
+1

спасибо, очень hepfull –

2

Правильный ответ уже был дан Андреем. Тем не менее, я уже некоторое время экспериментировал с некоторыми экспериментами, и я хотел бы показать, что я считаю другим относительно простым способом, который имеет некоторые преимущества. Кроме того, это метод, который MATLAB использует для своих встроенных функций совсем немного.

Я имею в виду такого рода ключ-значение пары способ передачи аргументов:

x = 0:pi/50:2*pi; 
y = sin(x); 
plot(x, y, 'Color', 'blue', 'MarkerFaceColor', 'green'); 

Есть множество способов разбора массив varargin клеток, но чистый способ сделать это, что я имею найденный до сих пор, использует класс MATLAB inputParser.

Пример:

function makeSandwiches(amount, varargin) 
%// MAKESANDWICHES Make a number of sandwiches. 
%// By default, you get a ham and egg sandwich with butter on white bread. 
%// Options: 
%// amount  : number of sandwiches to make (integer) 
%// 'butter'  : boolean 
%// 'breadType' : string specifying 'white', 'sourdough', or 'rye' 
%// 'topping' : string describing everything you like, we have it all! 

p = inputParser();       %// instantiate inputParser 
p.addRequired('amount', @isnumeric);  %// use built-in MATLAB for validation 
p.addOptional('butter', 1, @islogical); 
p.addOptional('breadType', 'white', ...  %// or use your own (anonymous) functions 
    @(x) strcmp(x, 'white') || strcmp(x, 'sourdough') || strcmp(x, 'rye')); 
p.addOptional('toppings', 'ham and egg', @(x) ischar(x) || iscell(x)) 
p.parse(amount, varargin{:});    %// Upon parsing, the variables are 
              %// available as p.Results.<var> 

%// Get some strings 
if p.Results.amount == 1 
    stringAmount = 'one tasty sandwich'; 
else 
    stringAmount = sprintf('%d tasty sandwiches', p.Results.amount); 
end 

if p.Results.butter 
    stringButter = 'with butter'; 
else 
    stringButter = 'without butter'; 
end 

%// Make the sandwiches 
fprintf(['I made you %s %s from %s bread with %s and taught you ' ... 
    'something about input parsing and validation in MATLAB at ' ... 
    'the same time!\n'], ... 
    stringAmount, stringButter, p.Results.breadType, p.Results.toppings); 

end 

(косые после комментариев, потому что ТАК не поддерживает подсветку синтаксиса MATLAB)

дополнительными преимуществами данного способа являются:
- Возможность установки по умолчанию (например, Python, где вы можете установить в функции подпись arg=val)
- Возможность корректной проверки ввода
- Вы только должны помнить имена опций, а не их порядок, как порядок не имеет значения

МИНУСЫ:
- там могут быть некоторые накладные расходы, которые могут стать существенными при выполнении многих вызовов функций, а не многое другое (не проверено)
- вы должны использовать Results свойства из inputParser класса вместо того, чтобы использовать переменные непосредственно

Смежные вопросы