Неполиморфный метод вызова экземпляра в D? - PullRequest
2 голосов
/ 01 января 2011

Как вы статически вызываете конкретное определение метода экземпляра из вне класса объекта, чтобы запретить полиморфизм в этом конкретном использовании? (Другими словами: мне нужен эквивалент Visual Basic .NET MyClass, но извне.)

Ответы [ 3 ]

3 голосов
/ 02 января 2011

Вы можете форсировать вызов, создавая делегата и вызывая его. По памяти:

void delegate(int, float) dg;

dg = &t.theFunction;  // gives the function for the dynamic type
// OR
dg.ptr = t;  // gives the object

dg.funcptr = &typeof(t).theFunction; // gives the function for the static type 

dg(1,3.1415);

ОТО, это хак в моей книге, и для некоторых типов это обязательно вызовет проблемы.

1 голос
/ 02 января 2011

Есть ли причина, по которой вы используете полиморфные методы класса, когда вы не хотите этого?Я также не уверен, что вы подразумеваете под внешним классом (это то, что вы хотите вызывать функцию-член без экземпляра объекта)?

Я сделаю некоторые предположения о том, что вы, вероятно, должны делатьэто написать нормальные функции, которые принимают объекты в качестве первого параметра.

binarySize(MyClass myObject) {  ... }

Функцией, которая еще не добавлена ​​ни в один D-компилятор, является возможность вызывать это так:

myObject.binarySize();
0 голосов
/ 01 января 2011

вы можете использовать typeof(this).myfunc() внутри функции экземпляра класса, чтобы сделать не виртуальный вызов. Если вам нужно вызывать виртуальный метод не виртуально из-за пределов класса, вы можете добавить новый (окончательный) метод в класс, который обернет вызов.

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