koala написав:Рефлексія - це крайній засіб, бо вона дуже дорога за ресурсами. Давайте спробуємо розібратися спершу, чому вам потрібна саме така схема доступу до даних. Ви не кажете, що це за класи; але очевидно, що PoorClase має якийсь безпосередній стосунок до ExampleClass. Дуже тісний. Настільки тісний, що є його частиною. Ну то так і робимо:
class ExampleClass {
protected string key = "some hidden value";
public class PoorClase {
public PoorClase(ExampleClass e) {
Console.WriteLine(e.key);
}
}
}
public class Program
{
public static void Main() {
ExampleClass.PoorClase p = new ExampleClass.PoorClase( new ExampleClass() );
}
}
І все - жодних рефлексій.
Розібравшись більш-менш з C#core я вирішив написати елементарну консольну гру Hangman використовуючи ООП принцип.
https://en.wikipedia.org/wiki/Hangman_(game)
В мене є три типи:Player,WordsContainer та Game.
Спершу ідея виглядала так.Я описую клас Player.
namespace Hangman
{
class Player
{
/// <summary>
/// class Player consist fields: player name,amount of lives, amount of game points and bool variable
/// which represents is current player alive or not.
/// Class methods consist constructors and showPlayerInfo methods.
/// </summary>
public string name { get; set; }
public int livesAmount { get; private set; }
public int pointsAmount { get; private set; }
protected bool playerIsAlive = true;
public bool isAlive
{
get { return playerIsAlive; }
set { playerIsAlive = (this.livesAmount > 0) ? true : false; }
}
public Player():this("NoName",0,3) {}
public Player(string name):this(name,0,3) {}
protected Player(string name,int pointsAmount,int livesAmount = 3)
{
this.name = name;
this.livesAmount = livesAmount;
this.pointsAmount = pointsAmount;
}
public void ShowPlayerInfo()
{
if (playerIsAlive)
Console.WriteLine("{0} player has {1} points and {2} lives amount.", name, pointsAmount, livesAmount);
else
Console.WriteLine("{0} player get {1} game points,well played.", name, pointsAmount);
}
}
}
Тоді реалізую контейнер котрий містить список слів і містить метод public string getKeyWord().
namespace Hangman
{
class WordsContainer
{
/// <summary>
/// WordsContainer class contains a list of strings from wich with getKeyWord method
/// we could get string type key.
/// </summary>
private List<string> wordBank = new List<string>() {"stack","queue","heap","git","array"};
public WordsContainer(){}
public string getKeyWord()
{
Random random = new Random((int)DateTime.Now.Ticks);
return wordBank[random.Next(0, wordBank.Count)];
}
}
}
Ну а вже клас Game повинен був би містити в собі об'єкт типу Player та об'єкт типу WordsContainer.Тут я подумав,що хотів би приховати метод public string getKeyWord() від усіх інших класів окрім самого class WordsContainer та Game.З Вашою ієрархією
class ExampleClass {
protected string key = "some hidden value";
public class PoorClase {
public PoorClase(ExampleClass e) {
Console.WriteLine(e.key);
}
}
}
мій клас WordsContainer міститиме клас Game,що як в моєму випадку не логічно.
Виклав теж саме питання на SO:
http://stackoverflow.com/questions/3448 … apsulation