Есть ли способ перегрузить математическую функцию для пользовательского типа? - PullRequest
0 голосов
/ 15 октября 2018

Я знаю, что вы можете сделать перегрузку оператора (+ - * /) для пользовательского типа.Есть ли способ сделать то же самое для пользовательских математических функций?Это сделало бы векторную работу более естественной (как в R).Пример:

vector = [1, 2, 3, 4, 5]

vector + vector = [2, 4, 6, 8, 10]  # can be achieved with operator overloading
vector * 5 = [5, 10, 15, 20, 25] # can be achieved with operator overloading

pow(vector, 2) = [ 1, 4, 9, 16, 25 ]  # is it possible in C#?

update
Из приведенных ниже ответов я вижу, что «перегрузка функций» невозможна (вероятно, не имеет особого смысла) и лучший способ справитьсято есть для создания пользовательской библиотеки математических функций (статический класс).
Это решение хорошо, хотя есть ли способ повторно использовать "пользовательские функции" с другими пользовательскими типами?Скажем, у меня есть числа (int / float), комплексные числа, векторы и матрицы (массив векторов).Я хочу, чтобы моя функция Pow работала со всеми 4 типами (она должна приводить в действие каждый числовой элемент в объекте).
Кроме того, есть ли возможность использовать функцию для выполнения различных действий в зависимости от типа ввода?Например

abs(-1) = 1  # for integer abs just change the sign if negative
abs(4+3i) = sqrt(4^2+3^2) = 5 # smth different for complex number

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете достичь чего-то подобного, используя функцию using static, добавленную в C # 6. Это позволяет вам делать статические методы из класса доступными без указания имени типа.(Класс .NET Math часто цитируется как пример для этой функции.)

Предполагая, что класс Vector реализует IEnumerable<double>, вы можете создать класс, содержащий вашиstatic Pow function:

namespace Vectors
{
    public static class VectorMath
    {
        public static Vector Pow(Vector v, int exponent)
        {
            return new Vector(v.Select(n => Math.Pow(n, exponent)));
        }
    }
}

Затем в любой файл кода, где вы хотите использовать этот класс, включите оператор

using static Vectors.VectorMath;

Это позволит вам вызвать Pow метод без необходимости указывать, что он является членом VectorMath класса:

class Program
{
    static void Main(string[] args)
    {
        Vector v = new Vector { 1, 2, 3 };
        Vector squares = Pow(v, 2);

        // Squares now contains [1, 4, 9]
    }
}
0 голосов
/ 15 октября 2018

Вы можете создать метод расширения pow () для класса Array

 public static class VecorExtension
{
        public static void pow(this Array vector, int i)
        {
            ...
        }
}

использование:

[1,2,3] .pow (2);

Методы расширения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...