Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested class with hidden constructor impossible in c#?

I' ve been doing some programming lately and faced an issue which i found weird in c#. (at least for me)

public class Foo
{
    //whatever
    public class FooSpecificCollection : IList<Bar>
    {
         //implementation details
    }
    public FooSpecificCollection GetFoosStuff()
    {
         //return the collection
    }
}

I want the consumer of Foo to be able to obtain a reference to FooSpecificCollection, even perform some operations on it. Maybe even set it to some other property of Foo or smth like that, but not To be able to CREATE an instance of this class. (the only class that should be able to instatiate this collection should be Foo.

Is my request really that far-fetched? I know that people way smarter defined c# but shouldn't there be such an option that a parent class can create a nested class instance but nobody else can't.

So far I created a solution to make an abstract class, or interface available through the property and implement a concrete private class that is not available anywhere else.

Is this a correct way to handle such a situation.?

like image 466
luckyluke Avatar asked Mar 13 '10 21:03

luckyluke


People also ask

What are constructors and nested class in C++?

Constructors are member functions of a class which initialize the values of objects of the class. They have the same name as the class name and they are automatically called when an object is created. Now, what is a nested class? C++ allows us to define a class within another class. A nested class is a class defined within another class.

What are constructors in C++?

Constructors are member functions of a class which initialize the values of objects of the class. They have the same name as the class name and they are automatically called when an object is created.

What are the types of nested classes in Java?

A nested class can be declared as a private, public, protected, internal, protected internal, or private protected. Outer class is not allowed to access inner class members directly as shown in above example. You are allowed to create objects of inner class in outer class.

What is the difference between nested class and enclosing class?

The nested class is also a member variable of the enclosing class and has the same access rights as the other members. However, the member functions of the enclosing class have no special access to the members of a nested class.


1 Answers

The way embedded classes work is that they, as members of the outer class, get access to private members of that outer class. But not the other way around (what is what you want).

You can shield the constructor of FooSpecificCollection, but then the Factory has to be part of FooSpecificCollection itself. It could enlist the outer class:

public class Foo
{
    public class FooSpecificCollection : List<Bar>
    {
         private FooSpecificCollection ()   { }

         public static FooSpecificCollection GetFoosStuff()
         {
            var collection = new FooSpecificCollection ();
            PrepareFooSpecificCollection(collection);
            return collection;            
         }
    }

    private static void PrepareFooSpecificCollection(FooSpecificCollection collection)
    {
         //prepare the collection
    }
}
like image 154
Henk Holterman Avatar answered Nov 15 '22 15:11

Henk Holterman