2013-04-26 4 views
1

Я фактически разместил это на форумах Unity, но ни один из моих вопросов, связанных с языком, никогда не получил ответа. Итак, допустим, у меня есть функция, определенная как это в Unity Script:Функция Downcasting в UnityScript

function GetSomething : SomeClass 
{ 
    return new SomeClass(); 
} 

Где SomeClass это некоторый класс, определенный в другом месте. Теперь у меня есть переменная, функция, типа Function, и я хочу убедиться, что она что-то возвращает. Так что я делаю следующее:

// theFunction is set to GetSomething somewhere else in the program. 
var functionThatReturnsSomething = theFunction as function() : Object; 

if (functionThatReturnsSomething != null) 
//... call it and do stuff with the returned value. 

Сейчас, к сожалению, в приведенном выше коде functionThatReturnsSomething будет нулевым. Для этого не быть пустым, я должен быть более конкретным и приведение к функции(): SomeClass ИЛИ просто переопределить определение функции, чтобы вернуть объект, как так:

function GetSomething : Object 
{ 
    return new SomeClass(); 
} 

Это очень раздражает, потому что его легко забыть to: Object (особенно если вы оставите его, он будет правильно вывести его как возвращаемый тип SomeClass), и результат не является ошибкой, а скорее очень тонкой ошибкой, так как сбрасывание происходит неудачно. Есть ли способ получить поведение, которое я хочу, чтобы оно было правильно опущено для функции(): Object, так же, как я могу сбрасывать обычные объекты?

+0

erm .. Почему бы вам просто не назвать функцию по имени? В чем смысл иметь объект сам по себе? – noob

+0

Моя программа в буквальном смысле не делает выше, это ситуация, которая возникает из класса, который может содержать обратный вызов. Обратный вызов имеет тип Function, и пользователь API может выбрать, чтобы обеспечить обратный вызов, который либо возвращает значение (и это значение используется), либо тот, который возвращает void. Я использую typecast, чтобы проверить, в каких ситуациях я нахожусь. –

+0

Итак, я согласен, зачем делать объект? почему бы просто не установить и не получить эту часть данных? – crychair

ответ

0

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

#pragma strict 

import System.Collections.Generic; 

function Start() 
{ 
    // theFunction is set to GetSomething somewhere else in the program. 
    var functionThatReturnsSomething = GetSomething as function() : Object; 

    if (functionThatReturnsSomething != null) 
    { 
     //... call it and do stuff with the returned value. 
     Debug.Log(functionThatReturnsSomething); 
    } 
    else Debug.Log("null"); 
} 

function GetSomething() : List.<int> 
{ 
    return new List.<int>(); 
}