Достойный аналог friend-классам в C#
В С++ была очень удобная штука - ключевое слово *friend*.
К примеру, имеем мы класс "Group" - группа студентов, "Student" - студент;
В классе "Group" имеем массив студентов, т.е. экземпляров класса "Student". А в классе "Student" имеем поле "Name" - разумеется, закрытое(_private_) от использования вне методов этого класса.
Предположим, мы реализовываем метод поиска студента по имени(т.е полю "Name") в массиве студентов. Разумеется, метод принадлежит классу "Group", так как в поле данного класса - массиве студентов мы будем искать студента с указанным нами именем.
Но: При проверке имени нам нужно использовать
Massiv[index].Name
- поле класса "Student", доступ к которому можно получить только из методов класса "Student", но у нас то метод класса "Group"!
Делать поле открытым и тем самым рушить постулаты ООП? Делать в "Student" отдельный метод для проверки имени и вызывать его каждый раз при переборе студентов в массиве, что жутко неэффективно с точки зрения времени выполнения по сравнению с простым сравнением строк?
Ответ
Не понимаю зачем делать студенту приватное поле имени. И вообще вложенные типы делать не рекомендуется, это не универсально. За исключением некоторых ситуаций, когда данный тип специфичен. В данном случае нет. Чтобы правильно организовать доступы надо использовать свойства. Вот например хочешь ты, чтобы никто не мог изменить кроме студента свое имя, ну так и сделай:
public class Student
{
private string name;
public string Name { get { return name; } }
public Student(string name)
{
this.name = name;
}
}А еще есть такая классная штука, как автосвойства. Они намного упрощают жизнь для написания таких конструкций. Вот, смотри пример:
public class Student
{
public string Name { get; private set; } // Доступ на чтение из-вне есть, а на запись только внутри этого класса
public Student(string name)
{
this.Name = name;
}
}GeneralElConsul, пишешь про постулаты ООП, но сам не можешь правильно собрать архитектуру) Ничего, это приходит со временем. Я конечно не супер архитектор, но продумывать архитектуру умею.
И да не торопись закрывать вопрос раньше времени
Смотрите также:
Комментарии
Использовать такую возможность C#, как вложенные типы. В данном случае - вложенный класс.
class Group
{ ...
...
class Stident
{
...
...
}
...
}И поле "Name" сделать public. Тогда в методе "Group" будет доступно после "Student.Name" и в тоже время недоступно вне методов этих двух классов.
Если при этом у вас возникли какие-либо ошибки "несовместимость по доступности" у меня так было в индексаторе класса "Group" и при передаче параметра params Student[] надо приписать к классу "Student" спецификаторы "internal" или "public" и подобных ошибок не будет.
Не понимаю зачем делать студенту приватное поле имени. И вообще вложенные типы делать не рекомендуется, это не универсально. За исключением некоторых ситуаций, когда данный тип специфичен. В данном случае нет. Чтобы правильно организовать доступы надо использовать свойства. Вот например хочешь ты, чтобы никто не мог изменить кроме студента свое имя, ну так и сделай:
public class Student
{
private string name;
public string Name { get { return name; } }
public Student(string name)
{
this.name = name;
}
}А еще есть такая классная штука, как автосвойства. Они намного упрощают жизнь для написания таких конструкций. Вот, смотри пример:
public class Student
{
public string Name { get; private set; } // Доступ на чтение из-вне есть, а на запись только внутри этого класса
public Student(string name)
{
this.Name = name;
}
}GeneralElConsul, пишешь про постулаты ООП, но сам не можешь правильно собрать архитектуру) Ничего, это приходит со временем. Я конечно не супер архитектор, но продумывать архитектуру умею.
И да не торопись закрывать вопрос раньше времени
Возможность добавлять комментарии была ограничена


<a href= http://mosros.flybb.ru/viewtopic.php?f=2&t=635>Процесс получения диплома стоматолога: реально ли это сделать быстро?</a>