2013-05-29 1 views
1

У меня есть проект C#, который нужно переписать в java. К сожалению, первоначальный программист не может быть достигнут, и у меня есть некоторые проблемы с некоторыми конкретными вещами C# в проекте.Статическая функция C# с этим как параметр для функции Java

Допустим, у нас есть класс в C#, как:

public static class MySampleClass : Object 
{ 
    ... 
    public static IEnumerable<MyObject> MyFunc(this MyObject t) { 
    //a lot of code 
    } 
    ... 
} 

Я не понимаю этот перед параметром в этой функции. На что он ссылается? Я имею в виду, что мы находимся в статическом классе и статической функции, так что значит «это»? Это только ссылка на t?

И, конечно, мой вопрос будет, что эта функция заголовок заменитель для этого в Java:

public static Iterable<MyObject> MyFunc(MyObject t) 

Или мне нужно сделать что-нибудь еще?

Спасибо за вашу помощь

+0

и для сравнения java: http://stackoverflow.com/questions/4359979/java-equivalent-to-c-sharp-extension-methods –

ответ

3

В этом случае this относится к любому экземпляру MyObject. Это называется extension method:

Методы расширения позволяют «добавлять» методы к существующим типам без создания нового производного типа, перекомпиляции или иначе изменения исходного типа. Методы расширения - это особый вид статического метода , но они вызываются так, как если бы они были методами экземпляра на расширенного типа.

Он определяет метод, который может использоваться для экземпляров класса MyObject. На Java нет такой вещи, поэтому вам нужно добавить этот метод в класс MyObject.

+0

Так что в принципе мне не нужно ничего делать, если функция действительно не ссылается на " это "как объект, так или иначе? – user2001951

+0

Ну, вы можете просто удалить 'this', и это сработает, но вместо' myInstance.MyMethod' вам придется делать 'MyClass.MyMethod (myInstance)'. – Zbigniew

+0

Вы также можете переместить 'MyMethod' в' MyClass', поэтому вам не придется передавать аргумент 'myInstance'. – Zbigniew

0

Методы расширения, как указано в его ответе, могут быть объявлены в любом месте и могут быть просто вызваны, как если бы они были объявлены в классе.

Это не существует на Java. Вам нужно будет добавить MyFunc в объявление этого класса Java.

0

Использование this таким образом делает способ extension method. Java не имеет эквивалента. В C# это синтаксический сахар, который позволяет делать то же самое, как это:

MySampleClass.MyFunc(myObject); 

С помощью этого кода:

myObject.MyFunc(); 

(Эти компилировать то же самое, пока MySampleClass «s пространство имен импортируется и MyObject не декларирует свой MyFunc() метод.)

Поскольку не существует в Java, вы должны просто заменить myObject.MyFunc() с MySampleClass.MyFunc(myObject).

0

Это метод расширения, что позволит любому объекту типа MyObject выставить метод MyFunc и использовать его как обычный метод экземпляра (но в действительности это не так) это метод обычного класса

MyObject o=new MyObject(); 
//whitout extension method 
MyObject.MyFunc(o); 
//with extension 
o.MyFunc(); 

Это синтаксический сахар, который не существует в Java, поэтому вам нужно изменить класс MyObject и добавить метод экземпляра MyFunc, если вы не хотите изменять все вызовы MyFunc или писать статическую функцию и изменять каждый вызов MyObject.MyFunc (o) ;

Смежные вопросы