Использование родительского класса и структуры ОО

Я прошу прощения за абстрактную природу этого вопроса (не могу опубликовать реальный код по деловым причинам), но я унаследовал некоторый код, который я считаю неправильным с точки зрения структуры, и я хотел бы, чтобы кто-то подтвердил его неверность. Несколько советов о том, как я могу это исправить, так как мои навыки ОО не такие, какими они должны быть, были бы блестящими.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mynamespace
{
    public class TopClass
    {
        private MiddleClass middleClass;

        public TopClass()
        {
            this.middleClass = new MiddleClass();
        }

        public void SomeEventOccured()
        {
            BottomClass b = new BottomClass();
            this.middleClass.NewBottomClass(this, b);
        }
    }

    public class MiddleClass
    {
        private List<BottomClass> bottomClasses;

        public void NewBottomClass(TopClass topClass, BottomClass newBottomClass)
        {
            // Need some functionality on TopClass here or use of it other properties.
            // topClass.SomethingElse...

            bottomClasses.Add(newBottomClass);
        }
    }

    public class BottomClass
    {
        // Any old class structure
    }
}

Запрос касается использования родительского класса внутри метода среднего класса, я думаю, что странно передавать родительский элемент при каждом вызове, чтобы средний класс мог использовать методы для него. Какие-либо предложения?

ОБНОВИТЬ:

Что мы думаем о том, чтобы это исправить: используйте делегаты и установите их в нижнем классе, чтобы вызывать верхний класс во всех областях, где выполняются методы. Точно так же свойства, доступные в верхнем классе, будут представлены через простые методы делегата. На наш взгляд, это устраняет круговое владение / ссылки и заменяет его двунаправленной связью между объектами. Мысли?

2 ответа

Решение

Вы можете определить интерфейс как IDoesWhatTopClassDoes который TopClass реализует. Это позволит среднему классу знать, что что-то, что реализует интерфейс, существует, но не может напрямую знать, что TopClass является.

Затем, чтобы устранить необходимость передачи ссылки каждый раз, Middleclass может содержать ссылку на член IDoesWhatTopClassDoes экземпляр передается через конструктор.

Создайте свойство в классе Child следующим образом

public TopClass Parent {get;private set;}

Затем установите его в конструкторе

public MiddleClass(TopClass parent)
{
    this.Parent = parent;
}

public TopClass()
{
   this.middleClass = new MiddleClass(this);
}

Тогда вы можете просто использовать Parent внутри MiddleClass без прохождения его все время.

Другие вопросы по тегам