Accessibility Levels Требуется помощь
От: yonis Россия  
Дата: 23.09.05 10:06
Оценка:
Существует некий код

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.
Re: Accessibility Levels Требуется помощь
От: Козьма Прутков Россия  
Дата: 23.09.05 10:27
Оценка:
> Проблема состоит в том чтобы операции класса Context были доступны только в классе А, при том что класс ContextItem должен быть виден только в классе A. Восможно ли такое в C#? И если возможно, то, что надо написать вместо <modifier>.
ну, friend'ов в C# нету, так что в лоб по сишному сделать не удастся. Но в этом случае можно, наверно, сделать так. Определяем некий интерфейс или базовый класс, функциональности которого достаточно для использоватния контекста всеми кроме А. Теперь делаем приватный вложенный в А класс контекста, являющийся наследником от описанного класса/интерфейса. Ну, а теперь, как можно догадаться, в методе GetContext создаем объект своего внутреннего класса и возвращаем ссылку на базовый класс/интерфейс. И так со всеми классами, у которых есть разница в доступной функциональности в зависимости от потребителя.
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
Re[2]: Accessibility Levels Требуется помощь
От: yonis Россия  
Дата: 23.09.05 11:08
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

>>ну, friend'ов в C# нету, так что в лоб по сишному сделать не удастся. Но в этом случае можно, наверно, сделать так. Определяем некий интерфейс или базовый класс, функциональности которого достаточно для использоватния контекста всеми кроме А. Теперь делаем приватный вложенный в А класс контекста, являющийся наследником от описанного класса/интерфейса. Ну, а теперь, как можно догадаться, в методе GetContext создаем объект своего внутреннего класса и возвращаем ссылку на базовый класс/интерфейс. И так со всеми классами, у которых есть разница в доступной функциональности в зависимости от потребителя.


Спасибо, неплохое решение. Скорее всего так и поступлю.
Re: Accessibility Levels Требуется помощь
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.09.05 11:13
Оценка:
Здравствуйте, yonis, Вы писали:

Y>Проблема состоит в том чтобы операции класса Context были доступны только в классе А, при том что класс ContextItem должен быть виден только в классе A. Восможно ли такое в C#?

Хм. А зачем тебе именно Context в В? Ты же не можешь у него ничего вызвать. Может, ограничиться object?
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Accessibility Levels Требуется помощь
От: yonis Россия  
Дата: 23.09.05 11:27
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Хм. А зачем тебе именно Context в В? Ты же не можешь у него ничего вызвать. Может, ограничиться object?


Ты имеешь ввиду object GetContext(), здесь это сработает, но вообще встречались такие ситуации, что другим классам неплохо бы использовать некие операции, например можно условно расширить пример:

public class Context
{
    // some methods
    public bool IsEmpty() {}    
}


public class SomeCommand : Command
{
    public override void Undo()
    {
        if (context.IsEmpty())
            // do         
    }
}
Re[3]: Accessibility Levels Требуется помощь
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.09.05 12:46
Оценка:
Здравствуйте, yonis, Вы писали:

Y>Ты имеешь ввиду object GetContext(), здесь это сработает, но вообще встречались такие ситуации, что другим классам неплохо бы использовать некие операции

Тогда это делается так:
public class BaseContext
{
   public bool IsEmpty { get { } }
}

private class Context: BaseContext 
{
  // все остальное
}

public BaseContext GetContext()
{
  Context context = new Context();
  ContextItem item = new ContextItem();
  context.Add(item);
  return context;
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.