Вы можете в значительной степени делать то, что хотите, если вы счастливы использовать вложенные типы.
Проверьте этот пример:
public class ExampleClassOne
{
private float Example = 0.5f;
public class ExampleClassTwo
{
public ExampleClassTwo(ExampleClassOne one)
{
Console.WriteLine(one.Example); //access to `Example`!
}
}
}
public class ExampleClassThree
{
public ExampleClassThree(ExampleClassOne one)
{
Console.WriteLine(one.Example); //No access to `Example`!
}
}
ExampleClassTwo
имеет доступ к ExampleClassOne
частные переменные, потому что они вложены в него.
ExampleClassThree
не имеет доступа.
Вы можете использовать его следующим образом:
var eco = new ExampleClassOne();
var ect = new ExampleClassOne.ExampleClassTwo(eco);
Теперь, это может быть немного громоздким, чтобы иметь дело с вложенными типами, поэтому общий шаблон, чтобы дать вам эту функциональность, состоит в том, чтобы реализовать его следующим образом:
public class ExampleClassOne
{
private float Example = 0.5f;
public class ExampleClassTwoImpl : ExampleClassTwo
{
internal ExampleClassTwoImpl(ExampleClassOne one)
{
Console.WriteLine(one.Example); //access to `Example`!
}
}
}
public class ExampleClassTwo
{
public static ExampleClassTwo Create(ExampleClassOne one)
=> new ExampleClassOne.ExampleClassTwoImpl(one);
internal ExampleClassTwo() { }
}
В этом шаблоне вы используете его следующим образом:
var eco = new ExampleClassOne();
var ect = ExampleClassTwo.Create(eco);