Ну, во-первых, вы могли бы создать третий класс:
internal class ImplementationDetail
{
private static readonly object lockme = new object();
public static void DoDatabaseQuery(whatever)
{
lock(lockme)
ReallyDoQuery(whatever);
}
}
, а теперь UseSQLKatana и UseSQLCutlass вызывают реализациюDetail.DoDatabaseQuery.
Во-вторых, вы можете решить не беспокоиться об этом и заблокировать объект, который виден обоим типам. Основная причина этого заключается в том, что становится трудно определить, кто блокирует объект, и трудно защитить от враждебного частично доверенного кода, блокирующего объект злонамеренно. Если вас не волнует ни один недостаток, вам не нужно слепо следовать рекомендациям.
Формула, возвращающая либо первое слово , либо все остальные слова .
=IF(ISERROR(FIND(" ",TRIM(A2),1)),TRIM(A2),MID(TRIM(A2),FIND(" ",TRIM(A2),1),LEN(A2)))
Примеры и результаты
Text Description Results
Blank
Space
some Text no space some
some text Text with space text
some Text with leading space some
some Text with trailing space some
some text some text Text with multiple spaces text some text
Комментарии к формуле:
Следующий код возвращает первое слово в ячейке A1, когда оно разделено пробелом (работает в Excel 2003):
=LEFT(A1, SEARCH(" ",A1,1))
=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)
Это сначала проверит, содержит ли ячейка пробел, если да, то вернет первое значение из пробела, иначе вернет значение ячейки.
Изменить
Просто чтобы добавить к приведенной выше формуле, как она есть, если в ячейке нет значения, она вернет 0. Если вы хотите отобразить сообщение или что-то, чтобы сообщить пользователю, что оно пустое, вы можете использовать следующее:
=IF(IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)=0, "Empty", IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3))
Эти вещи будут проще, если вы будете записывать их по ячейке за раз, разбивая длинные формулы на более мелкие, где вы можете проверять их по ходу. Затем вы можете скрыть промежуточные вычисления или свести их все в одну формулу.
Например, взяв формулу Джеймса:
=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)
Которая действительна только в Excel 2007 или более поздних версиях.
Разбейте ее следующим образом. :
B3: =FIND(" ", A3)
C3: =IF(ISERROR(B3),A3,LEFT(A3,B3-1))
Просто работать немного проще, по частям. Когда это будет сделано, вы можете превратить его в
=IF(ISERROR(FIND(" ", A3)),A3,LEFT(A3,FIND(" ", A3)-1))
, если хотите.