Как я могу предоставить вложенным структурам доступ к полям их родительских классов, не делая эти поля общедоступными или внутренними? - PullRequest
2 голосов
/ 11 марта 2019

У меня есть поле double[,] в классе, и важно, чтобы прямой доступ к нему не передавался извне, поэтому я создал свойство чтения-записи для управления им и сделал его private.У меня также есть вложенный struct в классе, который я хочу сохранить как тип значения.Сама структура имеет поле double[,], которое, опять же, управляется соответствующим свойством чтения-записи.При определенных условиях, если свойству присваивается значение, которое недопустимо определенным образом, оно выбрасывает пользовательский exception.Один из аргументов, который мне нужно передать exception, основан на значении поля double[,] из родительского класса, но я, кажется, не могу получить к нему доступ из структуры, не сделав его public или internal.Я пробовал оба protected и private, но ни один не работает.Есть ли другой обходной путь?

class myClass {
    protected double[,] classField;
    public double[,] classProperty {
        get { return (double[,])classField.Clone();
        set { /* code to validate the value and assign it */ }
    }
    private struct myStruct {
        private double[,] structField;
        public structProperty{ 
            get { return (double[,])structField.Clone(); }
            set {
                if (!validate(value)) 
                    throw new customException(classField.getLength(1));
                structField = (double[,])value.Clone();
            }
        }
        //other fields, constructors, and methods...
    }
    //other fields, constructors, and methods...
}

Я рассматривал возможность доступа к свойству вместо поля, но мне понадобится значение свойства для конкретного экземпляра, который включает рассматриваемый экземпляр структуры.Может быть, есть что-то вроде this.parent (я пробовал это, и это не сработало, но, возможно, какой-то обходной путь, похожий по концепции)?

1 Ответ

2 голосов
/ 11 марта 2019

Я предполагаю, что вы хотите, чтобы myStruct говорил с classField содержащего myClass экземпляра.

Если это так, то проблема не в доступности - к нему уже есть доступ;проблема в объеме .Что касается компилятора, то вложение здесь не связано с созданием экземпляров, поэтому проблема в том, что myStruct не имеет конкретного экземпляра из classProperty, с которым можно общаться.Вот почему ошибка:

Ошибка CS0120 Ссылка на объект требуется для нестатического поля, метода или свойства 'myClass.classField'

, а не для доступа:

Ошибка CS0122 «myClass.classField» недоступна из-за уровня защиты

На самом деле classField может быть private с точки зрения доступности: aвложенный тип может видеть private членов содержащего типа.

Что вам нужно сделать, это сделать что-то вроде:

private struct myStruct
{
    private readonly myClass _obj;
    public myStruct(myClass obj) => _obj = obj;
    // ...
}

, а затем вместо просто classField, вам нужноскажи это, чтобы поговорить с _obj.classField, чтобы сообщить ему экземпляр.Вам также нужно будет построить myStruct проходящий в конкретный myClass, к которому он относится.

По сути: концепция this.parent, которую вы упоминаете в вопросе, не является неявной -вам нужно реализовать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...