#c# #.net #class
#c# #.net #класс
Вопрос:
Как получить ссылку из атрибута класса низкого уровня на некоторые атрибуты верхнего уровня в том же классе в C #?
Да .. Давайте представим, что есть какой-то класс с 10 уровнями его иерархии. И мне нужно в какой-то момент получить ссылку с 10-го уровня на какой-то атрибут на 3-м уровне. И изменить его. Давайте представим, что часть атрибута нижнего уровня — это таймер, который сам что-то делает и нуждается в этом доступе.
Возможно ли это сделать?
Спасибо за любую подсказку!
ОБНОВЛЕНИЯ: Действительно, мы можем создать какой-нибудь внешний объект, который будет выполнять эту работу… Но идея состоит в том, чтобы сохранить внутри класса всю логику …
Комментарии:
1. 10 уровней наследования? Yikes! Как насчет того, чтобы предпочесть композицию наследованию?
2. Привет! Спасибо за ввод … Да… У меня действительно сложный класс. Я не хочу создавать каких-либо внешних менеджеров для изменения некоторых атрибутов класса. Вместо этого я хочу реализовать этот менеджер (таймер чтения) на некотором уровне класса. Вот почему мне нужно получить доступ из события таймера к некоторым атрибутам верхнего уровня класса.
3. Вы не можете изменять атрибуты, они запекаются в метаданные сборки во время компиляции. Избегайте решения проблемы сложности путем добавления дополнительных слоев.
4. Итак, есть только 1 решение, которое заключается в создании некоторого внешнего механизма для обработки класса? Я имею в виду идею о том, что класс изменяет себя как черный ящик.
5. Возможно ли предоставить какую-то самоссылку на нижние уровни класса? Это как получить владельца свойства? Я имею в виду, существует ли какая-либо система перекрестных ссылок внутри класса?
Ответ №1:
Ну, я не уверен, какая иерархия классов требует 10 уровней (это кажется слишком сложным и должно быть пересмотрено См. Структурные шаблоны из Gang of Four, такие как Composite или Decorator, чтобы вы могли уменьшить очень большую структуру наследования).
Я думаю, что понимание Закона Деметры также было бы полезно. По сути, вам не следует искать свойство или атрибут, которые вы хотите изменить, вы должны просто попросить об этом.
Просто создайте интерфейс типа ISpecificAttributeProvider, который реализует 3-й уровень, а затем на вашем 10-м уровне проверьте, реализует ли ваш текущий объект этот интерфейс.
public interface ISpecificAttributeProvider
{
object GetSpecificAttribute();
}
public class ThirdLevel : SecondLevel, ISpecificAttributeProvider
{
private object _attributeInQuestion;
public object GetSpecificAttribute()
{
return _attributeInQuestion;
}
}
public class TenthLevel: NinthLevel
{
public void Method()
{
if (this is ISpecificAttributeProvider)
object attribute = GetSpecificAttribute();
}
}
Надеюсь, это поможет
Комментарии:
1. Привет! Кажется, это то, о чем я просил! Спасибо!