oop - sobrecargados - Funciones de sobrecarga
sobrecarga de operadores poo (2)
Andrey ya ha dado la respuesta correcta. Sin embargo, he estado realizando algunos experimentos desde hace algún tiempo y me gustaría mostrar lo que creo que es otra manera relativamente directa que tiene algunos beneficios. Además, es un método que MATLAB utiliza bastante para sus funciones integradas.
Me refiero a este tipo de par de clave-valor para pasar argumentos:
x = 0:pi/50:2*pi;
y = sin(x);
plot(x, y, ''Color'', ''blue'', ''MarkerFaceColor'', ''green'');
Existen numerosas formas de analizar una varargin
celdas de varargin
, pero la forma más limpia de hacer esto que he encontrado hasta ahora utiliza la clase inputParser
MATLAB.
Ejemplo:
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
(barra después de los comentarios porque SO no admite el resaltado de sintaxis de MATLAB)
Los beneficios añadidos de este método son:
- Posibilidad de establecer valores predeterminados (como Python, donde puede establecer arg=val
en la firma de la función)
- Posibilidad de realizar validación de entrada de una manera fácil.
- Solo tiene que recordar los nombres de las opciones, no su orden, ya que la orden no importa
Desventajas:
- puede haber una sobrecarga que puede ser significativa al realizar muchas llamadas de función y no mucho más (no probado)
- tienes que usar la propiedad Results
de la clase inputParser
lugar de usar las variables directamente
¿Hay alguna manera de tener dos funciones con el mismo nombre pero con diferentes argumentos dentro de la misma clase en Matlab?
En resumen: No, no es posible.
Sin embargo, puedes imitar este tipo de comportamiento:
Obviamente, dado que Matlab es un lenguaje dinámico, puede pasar argumentos de cualquier tipo y verificarlos.
function foo(x)
if isnumeric(x)
disp('' Numeric behavior'');
elseif ischar(x)
disp('' String behavior'');
end
end
También puede usar varargin, y verificar el número de parámetros, y cambiar el comportamiento
function goo(varargin)
if nargin == 2
disp(''2 arguments behavior'');
elseif nargin == 3
disp(''3 arguments behavior'');
end
end