COM-объект в базовом классе - доступ через поле или свойство?

Я унаследовал кодовую базу dll С#, которые вызываются через COM-взаимодействие (по крайней мере, так было описано). Код C# также использует COM-объекты внутри для выполнения основных функций родительского приложения.

Я рефакторинг некоторых нарушений DRY из кода, потому что поиск дубликатов в 100 000 строк кода в 50 или 60 DLL неэффективно. Я столкнулся с использованием COM-объектов в абстрактных базовых классах, которые я хотел бы немного стандартизировать, но я нигде не нашел однозначного утверждения об этом конкретном использовании COM-объектов в C#.

Наш код в настоящее время имеет несколько базовых классов, содержащих COM-объекты, закодированные следующим образом:

public abstract class SomeBaseClass()
{
   protected IComObject comObject;

   protected virtual void Initialize(IComObject comObject)
   {
      this.comObject = comObject;
   }

   protected SomeBaseClass() { }
}

Чтобы предотвратить установку this.comObject в другом, кроме Initialize(), я хотел бы реализовать эти базовые классы следующим образом:

public abstract class SomeBaseClass()
{
   private IComObject comObject;

   protected IComObject ComObject
   {
      get { return comObject; }
   }

   protected virtual void Initialize(IComObject comObject)
   {
      this.comObject = comObject;
   }

   protected SomeBaseClass() { }
}

На мой взгляд, второй пример выглядит лучше и дает больше контроля над внутренним comObject.

В настоящее время существующие производные классы (C#) не устанавливают базовый класс comObject напрямую, а используют Initialize(), но ничто не мешает им напрямую назначать базовый класс comObject. Я хочу предотвратить возможную будущую ошибку при назначении comObject вне Initialize().

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

Спасибо!


person james    schedule 17.01.2010    source источник
comment
Я не знаю этот сценарий COM на 100% (следовательно, не ответ), но, как правило, поля должны быть закрытыми до тех пор, пока не будет чертовски серьезной причины этого не делать. Так что голосую за вариант 2.   -  person Marc Gravell    schedule 18.01.2010
comment
@Marc: Спасибо, это тоже отражает мои мысли. Просто надеюсь избежать подводных камней. ;в)   -  person james    schedule 18.01.2010


Ответы (1)


В COM-взаимодействии нет ничего, что отличало бы второй случай от первого. Не стесняйтесь настроить модификатор доступа к полю на закрытый.

person joncham    schedule 01.04.2011