Ситуация следующая:
Имеется три сборки:
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?
Помогите советом, запутался!
Заранее спасибо!
Здравствуйте, Whistler, Вы писали:
W>Ситуация следующая: [skipped]
W>Помогите советом, запутался!
W>Заранее спасибо!
Вы неправильно делаете, повышать доступность нельзя!
Необходимо, скорее всего, сделать 3
отдельных класса — один internal, в нем реализована вся функциональность, и 2 public — по одному для каждого ехе-шника. Хотя это тоже странная идея, в принципе, в одной либе создавать классы, которые будут доступны лишь в сборках с указанным public key (это имхо, ведь если для чего-то есть такая возможность, значит может кому-то и понадобится
)