ventajas sobrecargados sobrecarga resueltos poo polimorfismo operadores métodos metodos funciones ejercicios conclusion concepto oop matlab overloading

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