Nano Hash - криптовалюты, майнинг, программирование

.NET COM Interop, почему мы не можем реализовать наследование классов, например AutoDual

Есть ли способ сохранить наследование классов в C# и в то же время соблюдать правила наследования интерфейса COM-взаимодействия? Или, с другой стороны, как можно дублировать функциональность AutoDual с явными интерфейсами?

Я получил библиотеку API, написанную на C#, от другой компании, которая использует Microsoft.Runtime.InteropServices. Я использую его для компиляции в DLL, которую наше устаревшее программное обеспечение (в powerbuilder) использует для вызова API. Я пытаюсь использовать ClassInterfaceType.None, чтобы избежать ClassInterfaceType.AutoDual, что может нарушить функциональность в будущем. Я столкнулся со следующей проблемой:

Компания, написавшая библиотеку API, использовала хороший объектно-ориентированный дизайн. Хотя это снижает избыточность кода C#, это работает против моих целей, поскольку структура наследования классов противоречит требованиям COM-интерфейса. Например. методы Get для каждого запроса (их много) вызывают один и тот же метод, который ожидает унаследованный универсальный тип:

Общий метод:

private T Get<T>(string Foo, string Bar) where T : UmbrellaResponse, new() { /* get the response*/ }

Два из многих конкретных методов:

namespace SeparateFromTheObjects
{
    public SpecificResponse1 GetSpecificResponse1(string token)
        {
            return Get<SpecificResponse1>(token, "specific_thing");
        }

    public SpecificResponse2 GetSpecificResponse2(string token)
        {
            return Get<SpecificResponse2>(token, "specific_thing");
        }
}

Который в настоящее время наследуется следующим образом: public class SpecificResponse : UmbrellaResponse

Поэтому, если я создам интерфейс со всеми необходимыми свойствами/методами и изменю его на SpecificResponse : ISpecificResponse или даже : IUmbrellaResponse, все методы нельзя будет использовать, потому что они больше не наследуются от CLASS UmbrellaResponse.

В принципе, есть ли способ сохранить наследование классов в C# и в то же время соблюдать правила наследования интерфейса COM-взаимодействия? Или, с другой стороны, как можно дублировать функциональность AutoDual с явными интерфейсами?

Если это невозможно, как вы можете написать методы (такие как метод get выше) для размещения нескольких объектов, которые не наследуются от одного и того же типа?

Я прочитал следующее, но не думаю, что он содержит ответ: Почему я не должен использовать АвтоДвойной?

21.04.2017

  • Несколько неправильных представлений, и потребуется написать книгу, чтобы избавиться от них. Тот, который не сделает вас счастливым, никто не будет его писать. Но вы фокусируетесь на проблеме, которой на самом деле у вас нет. ClassInterfaceType.AutoDual сложен, потому что раскрывает слишком много деталей. Вид, требующий перекомпиляции клиентского кода при изменении класса C#. Обычно это большая проблема, но нет в вашем случае. Вы контролируете клиентский код и без проблем знаете, когда его перекомпилировать. 21.04.2017
  • @Hans_Passant Если я правильно понимаю, вы говорите, что, поскольку я единственный, кто компилирует, у меня не должно быть проблем с AutoDual? Думаю, я неправильно понял, что имелось в виду в сообщении, на которое я ссылался, когда Кевин цитирует MVP. Для раннего связывания вам придется перестраивать клиентов каждый раз, когда интерфейс регенерируется. Я не знаю, какой тип клиента будет ранним связыванием (извините за мое невежество). 21.04.2017
  • Это одно из заблуждений, InterfaceType.AutoDual не проблема. Проблема в том, что он работает только на интерфейсе, а у вас его нет, поэтому приходится хромать вместе с ClassInterfaceType.AutoDual. Что очень удобно, он автоматически генерирует интерфейс из определения класса. Но опасно, так как вы не можете легко сказать, что интерфейс изменился и стал несовместимым. Или избегать этого. Вероятен сбой и сжигание клиентского кода, использующего старое определение интерфейса, его перекомпиляция — большая проблема, поскольку это должен делать кто-то другой. Не твоя проблема, ты контролируешь и то, и другое. 21.04.2017
  • Может быть, здесь какая-то слишком сильная формулировка: ссылка. Спасибо @Hans_Passant. 21.04.2017
  • @smurtag, я согласен 31.01.2019

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..