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

Интеллектуальный указатель похож на обычный (введенный) указатель, как "символ* ", кроме тех случаев, когда сам указатель выходит из объема тогда, на что это указывает, удален также. Можно использовать его как Вы, был бы регулярный указатель, при помощи"->", но не, если Вам нужен фактический указатель на данные. Для этого можно использовать "& *ptr".

Это полезно для:

  • Объекты, которые должны быть выделены с новым, но что требуется иметь то же время жизни как что-то на том стеке. Если объект будет присвоен интеллектуальному указателю, то они будут удалены когда выходы программы та функция/блок.

  • Элементы данных классов, так, чтобы, когда объект удален, все находящиеся в собственности данные были удалены также без любого специального кода в деструкторе (необходимо будет быть уверены, деструктор является виртуальным, который является почти всегда хорошей вещью сделать).

Вы май не хотят использовать интеллектуальный указатель когда:

  • ... указатель не должен на самом деле владеть данными... т.е. когда Вы просто используете данные, но Вы хотите, чтобы он пережил функцию, где Вы ссылаетесь на него.
  • ... интеллектуальный указатель самостоятельно не собирается уничтожаться в какой-то момент. Вы не хотите, чтобы он находился в памяти, которая никогда не уничтожается (такой как в объекте, который динамично выделяется, но не будет явно удален).
  • ... два интеллектуальных указателя могли бы указать на те же данные. (Существуют, однако, еще более умные указатели, которые обработают это..., которое называют подсчет ссылок .)

См. также:

16
задан strager 26 November 2009 в 19:14
поделиться

3 ответа

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

Что вы можете сделать, так это переопределить и затенять реализацию базового класса и предоставить свой собственный новый читать / писать свойства. Я не знаю, как это сделать, не добавляя дополнительный класс в иерархию:

class AbsClassB : AbsClass
{
    public override double Top { get { return ((ConcClassB)this).Top } }
    public override double Bottom { get { return ((ConcClassB)this).Bottom } }
}


class ConcClassB :  AbsClassB
{
    new public double Top
    {
        get { ... }
        set { ... }
    }

    new public double Bottom
    {
        get { ... }
        set { ... }
    }
}

Лучше было бы определить защищенный виртуальный метод прямо в AbsClass и реализовать Вверх .get и Bottom.get в терминах этого метода. Затем вы можете переопределить этот метод прямо в ConcClassB и скрыть свойства без необходимости в дополнительном классе:

abstract class AbsClass : IClass
{
    public double Top
    {
        get { return GetTop(); }
    }

    public double Bottom
    {
        get { return GetBottom(); }
    }

    protected abstract double GetTop();

    protected abstract double GetBottom();
}

class ConcClassB :  AbsClass
{
    new public double Top
    {
        get { ... }
        set { ... }
    }

    new public double Bottom
    {
        get { ... }
        set { ... }
    }

    protected override double GetTop()
    {
        return Top;
    }

    protected override double GetBottom()
    {
        return Bottom;
    }
}
10
ответ дан 30 November 2019 в 23:46
поделиться

Использовать глобальную переменную.

-13
ответ дан 30 November 2019 в 23:46
поделиться

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

Кроме этого, мне трудно думать о проблеме с этим подходом. Они будут «скрывать» любые свойства суперкласса, но в любом случае в суперклассе нет установщиков свойств, так что это кажется нормальным. Похоже, это простейший обходной путь.

0
ответ дан 30 November 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: