Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make methods/properties visible to one class, hidden to others

I have a class Server which talks to a server connection for IRC. It holds a list of known Users, and creates them as necessary.

I have two problems involving the User class:

  1. Anyone can create an instance of a User. I only want the Server class to be able to do this.
  2. If a user (the thing User describes) changes his/her name (or other info, like joined channels), the Server class can change it itself. However, other classes can, too! I want to disallow other classes from touching this information (making it read-only to them).

How can I solve these two problems? In C++, it can be solved by using the friend keyword and making the ctor and setName (and such) private.

Is there a C# keyword which can allow a certain method be accessable by a specified class? This would solve my problem.

like image 550
strager Avatar asked Feb 15 '09 03:02

strager


2 Answers

Honestly I find the friend access that originated from C++ to be symptomatic of bad design. You're better off fixing your design.

For a start, who really cares if someone creates a User? Does it really matter? I ask this because it seems that sometimes we programmers get caught up worrying about things that simply won't happen or, if they do, it doesn't matter.

If you really do care then do one of the following:

  • Make User an interface. Server can instantiate a private class that implements it; or
  • Make User an inner class of Server with no public constructors so only Server can instantiate it.

Visibility hacks (of which friends in C++ are one and package access in Java are both good examples) are simply asking for trouble and not a good idea.

like image 77
cletus Avatar answered Sep 21 '22 00:09

cletus


The closest in the .NET world to friend is the internal visibility.

Note that if your two classes are in separate assemblies, you can use the InternalsVisibleTo attribute to allow one assembly visibility of the internals of the other.

like image 25
Bevan Avatar answered Sep 20 '22 00:09

Bevan