function _Max<T>(a,b,c,d: T): T; where T: IComparable<T>;
begin
Result := a;
if Result.CompareTo(b)<0 then Result := b;
if Result.CompareTo(c)<0 then Result := c;
if Result.CompareTo(d)<0 then Result := d;
end;
//ToDo так же Max с 2 и 3 параметрами
function Max_<T>(params a: array of T): T; where T: IComparable<T>;
begin
Result := a[0];
for var i := 1 to a.Length-1 do
if Result.CompareTo(a[i])<0 then
Result := a[i];
end;
//ToDo и всё это ещё раз, для Min
begin
_Max(1,2,3,4).Println;
_Max(4,3,2,1).Println;
Max_(1,2,3,4).Println;
Max_(4,3,2,1).Println;
end.
Это много методов, но явно меньше чем вот это вот всё:
///-function Max(a: число, b: число): число;
/// Возвращает максимальное из чисел a,b
function Max(a, b: byte): byte;
///--
function Max(a, b: shortint): shortint;
///--
function Max(a, b: smallint): smallint;
///--
function Max(a, b: word): word;
///--
function Max(a, b: integer): integer;
///--
function Max(a, b: BigInteger): BigInteger;
///--
function Max(a, b: longword): longword;
///--
function Max(a, b: int64): int64;
///--
function Max(a, b: uint64): uint64;
///--
function Max(a, b: real): real;
///-function Min(a: число, b: число): число;
/// Возвращает минимальное из чисел a,b
function Min(a, b: byte): byte;
///--
function Min(a, b: shortint): shortint;
///--
function Min(a, b: word): word;
///--
function Min(a, b: smallint): smallint;
///--
function Min(a, b: integer): integer;
///--
function Min(a, b: BigInteger): BigInteger;
///--
function Min(a, b: longword): longword;
///--
function Min(a, b: int64): int64;
///--
function Min(a, b: uint64): uint64;
///--
function Min(a, b: real): real;
///-function Min(a,b,...: T): T;
/// Возвращает минимальное из a,b,...
function Min<T>(params a: array of T): T;
///--
//function Min(params a: array of real): real;
///--
function Min(a, b, c: real): real;
///--
function Min(a, b, c, d: real): real;
///--
function Min(a, b, c: integer): integer;
///--
function Min(a, b, c, d: integer): integer;
///-function Max(a,b,...: T): T;
/// Возвращает максиимальное из a,b,...
function Max<T>(params a: array of T): T;
///--
//function Max(params a: array of real): real;
///--
function Max(a, b, c: real): real;
///--
function Max(a, b, c, d: real): real;
///--
function Max(a, b, c: integer): integer;
///--
function Max(a, b, c, d: integer): integer;
При этом функционала наоборот больше даёт.
Тесты ошибок - там только знак (>
/<
) перепутать можно, но это уже протестировано теми 4 строчками в begin-end.
Тесты скорости - я уже показал предыдущим сообщением, что это НЕ медленнее, чем писать отдельные Min
и Max
для каждого типа.