2012-05-17 2 views
2

Я даже не совсем уверен, как сформулировать свой вопрос, поэтому я просто покажу пример. Я хочу эквивалент:Как я могу предоставить доступ к частным переменным другому классу, но не к программисту?

public class OuterClass 
{ 
    public InnerClass DoStuff(InnerClass this_class) 
    { 
      this_class.number = 5; 
      return this_class; 
    } 


    public class InnerClass 
    { 
      private int number = 0; 
    } 

} 

У меня есть внутренний класс, который программист может установить некоторые переменные и такие в, но он также имеет некоторые внутренние переменные, которые они никогда не должны трогать или нужно знать. Внешний класс работает с экземплярами внутреннего класса, и он должен знать об этих внутренних переменных. Я могу придумать еще несколько запутанных способов сделать то, что хочу, но мне любопытно, есть ли способ достичь сути того, что я получил на C#? Или это просто невозможно.

Редактирование: для практического примера того, для чего это необходимо, это общий протокол связи, который я использую (связь сокетов). Существует класс оболочки socket (OuterClass), и вы создаете класс Message (InnerClass), устанавливаете в нем несколько вещей и передаете его оболочке сокета, которая обрабатывает все внутренние элементы. Класс Message имеет некоторые внутренние данные, которые устанавливаются и работают с оболочкой, и я надеялся, что могу получить это в оригинальном классе, не имея другого внутреннего класса для его хранения.

+0

Носите большую летучую мышь и угрожайте ударить любого, кто использует «внутренний» член. – jrummell

+0

Но если серьезно, я думаю, вы можете решить это, введя один тип в другой. Можете ли вы дать реалистичный пример того, что вы пытаетесь сделать? – jrummell

+0

@jrummell Я добавил небольшое объяснение – cost

ответ

9

Я думаю, вы хотите, чтобы фраза «давала доступ к другому из моих классов, но не к классам вне моей сборки».

Простым решением было бы объявить внутренние поля классов как internal, а не частным. Ваши классы в одной сборке могут обращаться к ним, но классы за пределами не могут.

+0

Вы избили меня до 5 секунд ... :) –

+0

И, как побочное примечание в случае, если вы проводите какое-либо тестирование, тогда вы все еще можете проверить внутреннее с InternalsVisibleTo (http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx) –

+0

Похоже, это то, что я хочу, большое спасибо – cost

0

Просто объявите InnerClassprivate. Никто за пределами OuterClass не сможет получить к нему доступ.

Если вы хотите передать экземпляры вокруг, наследуют от общественного класса или интерфейса, как это:

class OuterClass 
{ 
    public abstract class AbstractInnerClass { ... }; 
    private class InnerClass: AbstractInnerClass { ... }; 

    public AbstractInnerClass DoStuff(AbstractInnerClass this_class) 
    { 
     InnerClass real_class = (InnerClass)this_class; 
     ... do your stuff ... 
    } 
} 

наружу, только AbstractInnerClass существует, и InnerClass является лишь деталью реализации.