Re[52]: Вопрос к Vlad2: Nemerle & R#
От: Oyster Украина https://github.com/devoyster
Дата: 30.03.06 11:33
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>И выглядеть будет изоморфно коду моей реализации.


Pre-condition: Твой код я не видел и, пока не увижу, не могу его обсуждать.

Это будет код на C# — он не будет точно таким же, но будет решать ту же задачу. Или тебе тупо важна та же реализация вплоть до точки с запятой?

Ну и интерфейс у метода можно сделать такой же, как тот, что видит VBA, естественно (а что ещё нужно вызывающей стороне?...):

void Process(object obj1, object obj2, [собственно параметры метода])
{
    //...
}

Дальше в реализации на .NET есть как минимум три варианта:

  1. Тупые if по типу и вызов нужного метода внутри. Так писать неудобно и никто, естественно, как правило так не пишет.
  2. Декларативное описание реализации для данных двух типов. Тут атрибуты и reflection, так что всё в рантайме. Зато никакого хардкодинга и максималоно упрощено добавление новой реализации.
  3. То же, что и в п.2, но без reflection в рантайме — этот этап перенесён в compile-time. Тут можно использовать Nemerle и тоже всё будет пучком. Кстати, я думаю что тут хватит и сопоставления по образцу.

Для примеру вот простенькая реализация такого метода на Nemerle с использованием pattern-matching:

using System;
using System.Console;

public module Worker
{
    public Process(obj1 : object, obj2 : object, n : int) : void
    {
        match ((obj1, obj2)) {
            | (_ is int, _ is string) => WriteLine($"For int and string n = $n")
            | (_ is double, _ is string) => WriteLine($"For double and string n = $n")
            | (_ is string, _ is DateTime) => WriteLine($"For string and DateTime n = $n")
        }
    }
}

Worker.Process(1, "a", 2);
Worker.Process(1.1, "a", 3);
Worker.Process("a", DateTime.Now, 4);

Такой код выведет в консоль:

For int and string n = 2
For double and string n = 3
For string and DateTime n = 4
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.