oop — эквивалент Php __invoke () в других языках

Есть ли другой объектно-ориентированный язык, где есть концепция, эквивалентная Php? __invoke метод, который позволяет объекту быть обработанным как функция / вызываемое?

1

Решение

Вы хотите языки, которые позволяют перегрузка оператора, так как это то, что PHP __invoke разработан, чтобы быть похожим на.

Например, в C ++ вы можете сделать следующее:

#include <iostream>

class Test
{
public:
Test() : m_i(42) {}

friend std::ostream& operator<<(std::ostream& os, const Test& t)
{
os << t.m_i;
return os;
}

operator int()
{
return this->m_i;
}

void operator()()
{
std::cout << *this << std::endl;
}

private:
int m_i;
};

int main(int argc, char* argv[])
{
Test t;
// calls the operator<< overload to print "t"std::cout << "t = " << t << std::endl;
// calls the void operator()() to treat "t" as a function
t();
// calls the operator int() to treat "t" as an int type
int i = t;
std::cout << "i = " << i << std::endl;
return 0;
}

А в C # вы можете сделать что-то вроде следующего:

class Test
{
private int m_i = 42;
public delegate void MyDelegate(params int[] parms);

public static implicit operator int(Test t)
{
return t.m_i;
}

public static implicit operator MyDelegate(Test t)
{
return t.Invoke;
}

private void Invoke(params int[] parms)
{
foreach (int i in parms) {
this.m_i += i;
}
Console.WriteLine("i = {0}", this.m_i);
}

public override string ToString()
{
return this.m_i.ToString();
}
}

static void Main(string[] args)
{
Test t = new Test();
// calls t.ToString()
Console.WriteLine("t = {0}", t);
int d = t; // implicit cast to int
Delegate g = t; // implicit cast to Delegate type
Console.WriteLine("d = {0}", d);
// invoke the method pointed to by the delegate
g.DynamicInvoke(new int[] { 10, 20, 30 });
d = t; // implicit cast
Console.WriteLine("d = {0}", d);
}

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

Например, во всех этих примерах и в PHP вы могли бы написать простую перегрузку функции, которая делает то, что вам нужно, и была бы легко читаемой на нескольких языках:

PHP

class Test {
$m_i;

function Invoke() { return $m_i; }
function Invoke($x) { return $m_i + $x; }
}

C ++

class Test {
private: int m_i;
public:
int Invoke() { return this->m_i; }
int Invoke(int x) { return this->m_i + x; }
};

C #

class Test {
private int m_i;
public int Invoke() { return this.m_i; }
public int Invoke(int x) { return this.m_i + x; }
}

Надеюсь, что это может помочь.

1

Другие решения

Других решений пока нет …