Различные способы реализации интерфейса в C # vs Java [duplicate]

Он хорошо работает в сочетании с нулевым индексированием и len () . Например, если у вас есть 10 элементов в списке x , они пронумерованы 0-9. range (len (x)) дает вам 0-9.

Конечно, люди скажут вам, что это больше Pythonic для для элемента в x или для индекса, item в перечислении (x) , а не для i в диапазоне (len (x)) .

Нарезка тоже работает так: foo [1: 4] - это пункты 1-3 из foo (имея в виду, что элемент 1 на самом деле является вторым элементом из-за индексации на основе нуля). Для согласованности они должны работать одинаково.

Я думаю, что это: «первое число, которое вы хотите, за которым следует первое число, которое вы не хотите ». Если вы хотите 1-10, первое число, которое вам не нужно, равно 11, поэтому это диапазон (1, 11) .

Если он становится громоздким в конкретном приложении, достаточно легко написать небольшую вспомогательную функцию, которая добавляет 1 к концу индекса и вызывает range () .

0
задан ninja hedgehog 6 September 2013 в 12:09
поделиться

4 ответа

Извините, нет встроенной реализации классов в C #. Есть только Анонимные типы , но они не поддерживают добавление интерфейсов (см., Например, Может ли анонимный класс C # реализовать интерфейс? ) (и они не поддерживают методы добавления или поля ... Они поддерживают только свойства).

Вы можете использовать методы System.Reflection.Emit для создания класса во время выполнения, но это длинный и утомительный.

3
ответ дан Community 16 August 2018 в 11:35
поделиться
  • 1
    Есть ли какой-то хитроумный трюк, который достигает этого? – ninja hedgehog 6 September 2013 в 11:39
  • 2
    @ninjahedgehog Существует не-ниндзя-подобный хитрый трюк. Технически вы можете создать новый класс через Reflection, но это будет очень много работать. См. Например, stackoverflow.com/questions/15733900/… – xanatos 6 September 2013 в 11:41
  • 3
    @ninjahedgehog Если вы хотите принять интерфейс с одним методом (в вашем случае один метод void), вместо этого примите Action. – Patryk Ćwiek 6 September 2013 в 11:42
  • 4
    Черт и я искал ниндзя, как хитроумный трюк. Статический метод, который выполняет задание, и я просто должен установить, какой интерфейс я хочу ввести в качестве параметра. – ninja hedgehog 6 September 2013 в 11:42

Это довольно распространено в java, но вы не можете сделать это на C #. Вы можете передавать функции или процедуры в качестве параметров:

public void myMethod(Action act)
{
    act();
}

myMethod( () => Console.WriteLine("yay") );

Существует несколько (общая) версия действия (процедура с параметрами и без возвращаемого значения) и Func (функции с параметрами и возвращаемым значением).

0
ответ дан BlackBear 16 August 2018 в 11:35
поделиться

Вы можете создать класс, который обертывает Action и реализует этот интерфейс:

public sealed class SomeAction : ISomeInterface
{
    Action action;
    public SomeAction (Action action) { this.action = action; }
    public void DoIt() { this.action(); }
}

Это позволяет использовать его следующим образом:

object.myMethod(new SomeAction(() => Console.WriteLine("yay"));

Это конечно, очень практично, если вы собираетесь повторно использовать SomeAction, но это, вероятно, самое удобное решение.

1
ответ дан g t 16 August 2018 в 11:35
поделиться

Ищите пакет NuGet «ImpromptuInterface». С помощью комбинации этого пакета и ExpandoObject вы можете сделать что-то вроде этого

//Create an expando object and create & assign values to all the fields that exists in your interface
dynamic sigObj = new ExpandoObject();
sigObj.EmployeeKey = 1234;

//Create the object using "ActLike" method of the Impromptu class
INewSignatureAcquired sig = Impromptu.ActLike<INewSignatureAcquired>(sigObj);
0
ответ дан Tosh 16 August 2018 в 11:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: