Почему бы не объявить внутренний интерфейс (или внутренний абстрактный класс), чтобы его нельзя было создать, а затем закрытый внутренний класс, который реализует интерфейс?
Что-то вроде
using System;
namespace test {
class Outer {
public interface IInner {
void SayHello();
}
private class Inner : IInner {
public void SayHello() {
Console.WriteLine("Hello");
}
}
public IInner MakeInner() {
return new Inner();
}
}
class Program {
static void Main(string[] args) {
Outer x = new Outer();
x.MakeInner().SayHello();
}
}
}
Таким образом, только Outer
может создавать конкретные Inner
объекты, в то время как другие классы должны вызывать метод MakeInner
.
Обратите внимание, что таким образом вы также применяете ограничение для классов в той же сборке.