Использовать свойства базового слоя в ссылочной сборке [дубликат]

Основываясь на проблеме github # 620 , похоже, что вы скоро сможете сделать следующее:

df[df['A'].str.contains("hello")]

Обновление: векторизованные строковые методы ( т.е. Series.str) доступны в pandas 0.8.1 и выше.

2
задан skaffman 13 July 2010 в 11:09
поделиться

2 ответа

В C / C ++ определение класса присутствует в файле заголовка .h. Это дает вам возможность ссылаться на информацию о классе (при необходимости, например, когда вы хотите наследовать от этого класса) без необходимости использования исходного файла с информацией о реализации. Недостатком является дублирование кода (для реализации в файле .cpp требуется повторить большую часть информации в файле .h).

В .NET мире дизайн отличается: сборка содержит как код для класса ( CLR), а также все метаданные (имя класса, информация о его членах и т. Д.), Необходимые, например, для наследуем от этого класса.

Следствием этого проекта является то, что для использования класса, определенного в сборке A, наследуемого от класса в сборке B, .NET требуется как сборка A, так и B. Или более общий: если вы используете что-либо из данной сборки (класс, enum, struct), прямо или косвенно, вам нужно ссылаться на эту сборку.

Я не уверен, что вы хотите предотвращать. Если вы решили разделить свой код на две сборки, как вы описали, нет никакого способа обойти их оба.

Существуют, конечно, разные способы структурирования вашего кода, но не зная, какую цель вы пытаетесь достичь, разделив код на 2 сборки в первую очередь, невозможно сделать полезное предложение.

0
ответ дан Krzysztof Kowalczyk 21 August 2018 в 13:53
поделиться
  • 1
    Цель заключалась в создании обертки, которая защищала бы конечных пользователей от изменений на нижележащем слое. Эта оболочка будет ссылаться на базу. Поэтому, если пользователь должен ссылаться на базу, то он не полностью экранирован. Я понимаю, как собираются сборки .Net, но мне было интересно, есть ли способ обойти это (одна сумасшедшая идея заключалась в том, чтобы заменить базовый класс во время выполнения через отражение, не уверен, что это возможно). – Mrchief 15 July 2010 в 01:18

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

Предположим, что вы определили эти классы:

// in assembly 1:
public class A
{
    public virtual void Foo() { }
}

// and in assembly 2:

// requires explicit reference to assembly 1 to use
public class B : A
{
    public override void Foo() { }
    public A Value { get; set; }
    public void Foo(A value) { }
}
// has implicit reference to assembly 1, but end user can ignore
public class C
{
    private A Value { get; set; }
    internal void Foo(A value) { }
    protected internal A Bar() { return new A(); }
}
// usable at runtime even if assembly 1 is missing, as long as you don't call Foo()
public class D
{
    public void Foo() { A blah = new A(); }
    public void Bar() { }
}

Если конечный пользователь использует класс B, для них потребуется явная ссылка на сборку 1. Поскольку A является частью открытого интерфейса B, чтобы использовать B, вы должны знать об A. Существует 3 разных общедоступные ссылки на A, и любой из них потребует знания об A для использования B.

Однако класс C ссылается на A, но все ссылки являются частными / внутренними / локальными. Поскольку каждая ссылка на A скрыта снаружи, конечный пользователь не должен явно знать об ассемблере 1. Это все равно потребуется во время выполнения, но вам не нужно добавлять его в качестве ссылки, это косвенная ссылка .

И если конечный пользователь использует класс D, без использования B или C, сборка 1 будет загружаться только при вызове D.Foo (), которая имеет локальную переменную типа A. Вы можете фактически использовать D.Bar () свободно, даже если сборка 1 полностью отсутствует во время выполнения. Хотя если вы вызываете D.Foo (), а сборка 1 отсутствует, вы получите исключение.

2
ответ дан Bryce Wagner 21 August 2018 в 13:53
поделиться
  • 1
    Я понимаю. В моем случае я не могу уйти от него, так как я сразу наследовал (сценарий 1). Тем не менее, ответ, который я искал в то время, был ILMerge (которого я тогда не знал, но узнал позже)! – Mrchief 7 December 2012 в 22:33
  • 2
    Отличное объяснение того, как это работает, но я хотел бы понять, почему они спроектировали его таким образом. Когда вы делаете сборку, Assembly1.dll так или иначе попадает в папку bin, поэтому зачем нужна явная ссылка? – Borek Bernard 20 February 2013 в 16:16
  • 3
    Вероятно, облегчить работу компилятора. Таким образом, в принципе можно сказать, что «этот тип требует явной ссылки на другую сборку». или «этот тип включает в себя только внутренние ссылки на другую сборку», не анализируя, как каждый отдельный элемент класса когда-либо используется. – Bryce Wagner 20 February 2013 в 16:46
Другие вопросы по тегам:

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