Привязка метода выполнения - PullRequest
0 голосов
/ 19 октября 2011

Есть ли официальное название для того, что я обрисовал в общих чертах ниже.Пример в C #, но предпосылка будет применяться к другим языкам.Я почти уверен, что сделал что-то подобное несколько лет назад в каком-то другом мире, но какой из них, или название концепции, ускользает от меня.динамическая диспетчеризация (в некотором роде) ??

Ключевой момент, который я пытаюсь донести, заключается в том, что во время выполнения определяется метод для выполнения и вызывается.Методы будут иметь практически одинаковую сигнатуру, отличающуюся только типом аргумента, и что все аргументы находятся в одном и том же дереве наследования.Я знаю, что есть некоторые детали, которые я пропустил, но я хочу, чтобы пример был простым.

string result;
User u;
User user = new User();
Manager manager = new Manager();

u = user;
result = _Print(u);
Console.WriteLine(result); // user...

u = manager;
result = _Print(u);
Console.WriteLine(result); // manager...

// interested in part
private static string _Print(User u)
{
    return (u is Manager) ? Print((Manager)u) : Print(u);
}

// plumbing
private static string Print(User u)
{
    return "User...";
}
private static string Print(Manager m)
{
    return "Manager...";
}

class User { ... }
class Manager : User { ... }

1 Ответ

1 голос
/ 19 октября 2011

Это Динамическая отправка . Я изучаю его как динамическое связывание, потому что это функция связывания функций, предоставляемая многими ОО-языками, такими как Java, которая реализует его по умолчанию, и C ++, в котором требуется явное ключевое слово «virtual» для работы в 1003 * dynamic fashion - по умолчанию c ++ является статической привязкой. Тем не менее, современные в ОО динамическое связывание легко достигается с помощью Полиморфизм и Перегрузка . Таким образом, вы можете получить что-то вроде этого:

User u = new User(); 
Console.WriteLine(u.print()); // user...

u = new Manager();
Console.WriteLine(u.print()); // manager...


class User { ... 
    public string print(User u)
    {
        return "User...";
    }
... }
class Manager : User { ... 
    public string print(Manager m)
    {
        return "Manager...";
    }

... }

Но вам нужно адаптироваться к вашему языку. Я не знаю много о C #, и есть так много особенностей. Я нашел этот пост с некоторыми примерами для вас - http://www.codeproject.com/KB/cs/dynamicbindingincsharp.aspx

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