Получить «владельца» класса, если это свойство другого класса - PullRequest
0 голосов
/ 02 октября 2018

Это более общий вопрос для лучшего понимания с моей стороны.Предположим, у меня есть 3 класса:

  1. ClassA
  2. ClassB
  3. ClassC

ClassA и ClassB имеют ClassC в качестве публичного свойства, напримерthis:

class ClassA
{
    public ClassC cInstanceInA {get; set;}
}

class ClassB
{
    public ClassC cInstanceInB {get; set;}
}

Есть ли в моем ClassC изящный способ определить, является ли текущий экземпляр свойством ClassA или ClassB?Таким образом, я мог бы сделать что-то вроде этого

class ClassC
{
    public void myMethod()
    {
         if(IBelongToClassA)
         {
             //do something
         }
    }
}

Я знаю, я мог бы передать ClassA или ClassB (или там имя / другой идентификатор) в качестве ссылки на конструктор ClassC и сохранить информацию там, но я хотелзнать, есть ли более общий способ сделать это.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я не думаю, что есть хороший способ сделать это.Но, может быть, добавить myMethod к классам A и B?Что-то вроде:

class ClassA
{
    public ClassC cInstanceInA {get; set;}
    public void myMethod() {
      //Do something
      cInstanceInA.myMethod();
}

class ClassB
{
    public ClassC cInstanceInB {get; set;}
    public void myMethod() {
      //Do something
      cInstanceInB.myMethod();
}
0 голосов
/ 02 октября 2018

Нет, к сожалению, нет.Сам экземпляр не может знать , где он находится, потому что на самом деле все объекты хранятся в куче памяти , и когда вы ссылаетесь на экземпляр, все, что вам нужно сделать, это создать управляемый указатель на эту область памяти .

Еще больше - несколько объектов могут указывать на один и тот же экземпляр, поэтому может быть отношение один-ко-многим , которое показывает, что можетЭто не может быть какой-либо встроенный механизм, подобный этому.

Так что, если вы хотите создать родительско-дочерние отношения между двумя классами и вам нужен доступ к родителю из ClassC, вам нужно будет создать какой-то видссылка в этом классе.

Примечание: Благодаря сборщику мусора безопасно иметь круговые ссылки, так как они будут собираться вместе, когда на них больше нет ссылок.Это, однако, является проблемой в Xamarin.iOS , где вы должны помнить, что объекты, производные от классов на основе iOS, также будут подвергаться подсчету ссылок, при котором циклические ссылки сценария приведут к тому, что экземпляры останутсяв памяти навсегда.Чтобы избежать этого, вы можете украсить свои свойства атрибутом [Weak], который Xamarin.iOS может распознать и сломать сильную циклическую ссылку.См. документацию для получения дополнительной информации.

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