Вложенные конструкторы (или методы фабрики) хороший, или должны каждый сделать всю [закрытую] работу init

A UIView имеет свойство, называемое subViews, где элементы с более высокими индексами находятся перед элементами с более низкими индексами. Например, subView с индексом 1 находится перед subView с индексом 0.

При этом, чтобы получить кнопку сверху, вы должны отсортировать buttonArray так же, как организовано свойство subViews из UIView. Предполагая, что все ваши кнопки - это братья и сестры одного и того же UIView (это может быть не обязательно так, но вы можете настроить их так, чтобы они правильно сортировались):

var buttonArray = view.subviews.compactMap { [110] as? UIButton }

Таким образом, сохраняя ваш [117 ] отсортировано таким образом, вы хотите кнопку, которая содержит let point = sender.location(in: button) с более высоким индексом в массиве.

26
задан Andrew Backer 12 November 2008 в 22:41
поделиться

2 ответа

Я думаю, что это разумно цепочечным конструкторам вместе, но я делаю это другой путь - версия с меньшим количеством параметров называет версию с большим количеством параметров. Тем путем это делает его очень ясным, что происходит, и вся реальная "логика" (вне значений по умолчанию) находится в единственном месте. Например:

public Foo(int x, int y)
{
    this.x = x;
    this.y = y;
    precomputedValue = x * y;
}

private static int DefaultY
{
    get { return DateTime.Now.Minute; }
}

public Foo(int x) : this(x, DefaultY)
{
}

public Foo() : this(1, DefaultY)
{
}

Примечание, что, если у Вас есть много перегрузок конструктора, можно хотеть переместиться в статические методы фабрики вместо этого - который обычно делает код более ясным, а также позволяющий несколько методов взять тот же набор параметров, например,

public static XmlDocument FromText(string xml)

public static XmlDocument FromFile(string filename)
59
ответ дан 28 November 2019 в 07:00
поделиться

Редактирование 2016 года : Все еще перед временем, C# радикально сокращает или устраняет свою поддержку записей и поддержку конструктора по умолчанию C# 7, возможно, C# 8 наконец .

Редактирование 2015 года : Я был далеко впереди времени. C#6 и C#7 устраняют необходимость конструкторов.

, Если Вы разрабатываете в.Net 3.5, я никогда рекомендую не использовать конструкторов. Единственное исключение я уезжаю в это, - то, при использовании инжекционного конструктора для внедрения зависимости. С.Net 3.5 они инициализаторы созданного объекта, которые позволяют Вам делать

var myclass = New MyClass { arg1 = "lala", arg2 ="foo" }

Этот, будут initalize класс со значениями, присвоенными для arg1 и arg2 при отъезде arg3 как

default(typeof(arg3)).
-6
ответ дан 28 November 2019 в 07:00
поделиться
Другие вопросы по тегам:

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