namespace App.BL.Model
{
public class A
{
public static A Instance = new A();
public void Operation1();
public Context GetContext()
{
Context context = new Context();
ContextItem item = new ContextItem();
context.Add(item);
return context;
}
public class Context
{
<modifier> void Add(ContextItem item);
<modifier> ContextItem this[int index];
}
private class ContextItem {}
}
}
namespace App.BL.Commands
{
public SomeCommand : Command
{
private Context context;
public override void Execute()
{
A.Instance.Operation1();
}
public override void SaveOldState()
{
context = A.Instance.GetContext();
}
}
}
Проблема состоит в том чтобы операции класса Context были доступны только в классе А, при том что класс ContextItem должен быть виден только в классе A. Восможно ли такое в C#? И если возможно, то, что надо написать вместо <modifier>.
Вариант internal void Add и internal class ContextItem не подходит, так как в SomeCommand можно обратиться к методу Add, и классу ContextItem.
> Проблема состоит в том чтобы операции класса Context были доступны только в классе А, при том что класс ContextItem должен быть виден только в классе A. Восможно ли такое в C#? И если возможно, то, что надо написать вместо <modifier>.
ну, friend'ов в C# нету, так что в лоб по сишному сделать не удастся. Но в этом случае можно, наверно, сделать так. Определяем некий интерфейс или базовый класс, функциональности которого достаточно для использоватния контекста всеми кроме А. Теперь делаем приватный вложенный в А класс контекста, являющийся наследником от описанного класса/интерфейса. Ну, а теперь, как можно догадаться, в методе GetContext создаем объект своего внутреннего класса и возвращаем ссылку на базовый класс/интерфейс. И так со всеми классами, у которых есть разница в доступной функциональности в зависимости от потребителя.
Здравствуйте, Козьма Прутков, Вы писали:
>>ну, friend'ов в C# нету, так что в лоб по сишному сделать не удастся. Но в этом случае можно, наверно, сделать так. Определяем некий интерфейс или базовый класс, функциональности которого достаточно для использоватния контекста всеми кроме А. Теперь делаем приватный вложенный в А класс контекста, являющийся наследником от описанного класса/интерфейса. Ну, а теперь, как можно догадаться, в методе GetContext создаем объект своего внутреннего класса и возвращаем ссылку на базовый класс/интерфейс. И так со всеми классами, у которых есть разница в доступной функциональности в зависимости от потребителя.
Спасибо, неплохое решение. Скорее всего так и поступлю.
Здравствуйте, yonis, Вы писали:
Y>Проблема состоит в том чтобы операции класса Context были доступны только в классе А, при том что класс ContextItem должен быть виден только в классе A. Восможно ли такое в C#?
Хм. А зачем тебе именно Context в В? Ты же не можешь у него ничего вызвать. Может, ограничиться object?
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Хм. А зачем тебе именно Context в В? Ты же не можешь у него ничего вызвать. Может, ограничиться object?
Ты имеешь ввиду object GetContext(), здесь это сработает, но вообще встречались такие ситуации, что другим классам неплохо бы использовать некие операции, например можно условно расширить пример:
public class Context
{
// some methodspublic bool IsEmpty() {}
}
public class SomeCommand : Command
{
public override void Undo()
{
if (context.IsEmpty())
// do
}
}
Здравствуйте, yonis, Вы писали:
Y>Ты имеешь ввиду object GetContext(), здесь это сработает, но вообще встречались такие ситуации, что другим классам неплохо бы использовать некие операции
Тогда это делается так:
public class BaseContext
{
public bool IsEmpty { get { } }
}
private class Context: BaseContext
{
// все остальное
}
publicBaseContext GetContext()
{
Context context = new Context();
ContextItem item = new ContextItem();
context.Add(item);
return context;
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.