Доступ к наследованию кода сборки
От: Whistler Россия Блог на GotDotNet.ru
Дата: 01.03.06 17:30
Оценка:
Ситуация следующая:

Имеется три сборки:

1. DLL Class Library (X.DLL)

2. EXE Windows Application (A.EXE)

3. EXE Windows Application (B.EXE)

В чем суть:

В сборке X.DLL имеется класс "BaseMethods", который не должен быть доступен коду извне (помечен, как internal, abstract, все методы в нем protected — это не принципиально — главное — методы этого класса не должны вызываться из внешних сборок, и никто не должен иметь право из внешних сборок его наследовать, т.е. не иметь доступ к выполнению кода).

В этом классе определенное количество методов. Причем одни методы должны мыть доступны сборке A.EXE, другие сборке B.EXE — также существуют методы, которые должны быть доступны обоим сборкам.

Как можно сделать не заморачиваясь: просто разбить этот класс "BaseMethods" на два класса — по классу на каждую сборку. Методы для одной сборки перенести в один класс, методы из второй сборки перенести в другой класс, те методы, которые необходимы обоим классам — продублировать. И на этоти классы поставить по [StrongNameIdentityPermission] с атрибутами LinkDemand и с перечислением открытых ключей соответствующих EXE-шников.

Но я решил сделать так — иметь один internal abstract класс "BaseMethods" со всеми методами — protected. Что имеем — BaseMethods недоступен ниоткуда извне сборки, ок.

Затем, решил создать два дочерних от него класса "ClientMethods" и "RegistrationMethods" — для сборок A.EXE и B.EXE — соответственно., их уже сделать public, нужные методы для каждого класса вынести как виртуальные из protected в public, подписать каждый класс StrongNameIdentityPermission.


Т.е. один класс BaseMethods — реализует код — который никому не доступен,

и два "декларативных", или можно сказать "интерфейсных" класса, которые не содержат никакой реализации, а чисто выводят из protected в зону видимости необходимые методы.


Что на практике (пишу на C++ /CLI 2005):


private ref class BaseMethods abstract : public IDisposable
{
private:

    bool disposed;

public:

    // Конструкторы и финализаторы

    BaseMethods();

    ~BaseMethods();

    !BaseMethods();

protected:

    // Методы управления состоянием регистрации компьютера

    void A();

    void B();
}

public ref class ClientMethods sealed : public BaseMethods
{
public:
    String^ GetComputerIdentifier();
};


Нифига не получается:

1. Оказывается нельзя наследоваться public-классом от private-класса.

2. Как переводить методы из protected в public?


Помогите советом, запутался!

Заранее спасибо!
Re: Доступ к наследованию кода сборки
От: Tiarod Украина  
Дата: 01.03.06 17:48
Оценка:
Здравствуйте, Whistler, Вы писали:

W>Ситуация следующая: [skipped]


W>Помогите советом, запутался!


W>Заранее спасибо!


Вы неправильно делаете, повышать доступность нельзя!
Необходимо, скорее всего, сделать 3 отдельных класса — один internal, в нем реализована вся функциональность, и 2 public — по одному для каждого ехе-шника. Хотя это тоже странная идея, в принципе, в одной либе создавать классы, которые будут доступны лишь в сборках с указанным public key (это имхо, ведь если для чего-то есть такая возможность, значит может кому-то и понадобится )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.