Есть ли практическая альтернатива структурированию наследования? (С #) - PullRequest
10 голосов
/ 25 апреля 2010

Я пишу код, который будет заполнять свойства Margin, Padding и BorderThickness классов в пространстве имен System.Windows.Documents. Каждое из этих свойств принимает значение в форме System.Windows.Thickness, которое является структурой.

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

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

Спасибо за ваши идеи,

Тим

Ответы [ 3 ]

9 голосов
/ 25 апреля 2010

Нет хороших альтернатив.

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

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

Вот как вы могли бы это реализовать:

public class ThicknessEx
{
    public string ExtraData { get; set; }
    public Thickness Thickness { get; set; }

    public static implicit operator Thickness(ThicknessEx rhs)
    {
        return rhs.Thickness;
    }
}

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

1 голос
/ 25 апреля 2010

Возможно, вы сможете использовать Присоединенные свойства зависимостей типа AugmentedThickness, а затем, когда они изменятся, обновить базовые свойства, которые они предназначены для обновления. Для этого требуется, чтобы весь доступ выполнялся с использованием ваших Прикрепленных свойств, поскольку простая установка свойства «Толщина» не будет использовать вашу AugmentedThickness. При необходимости вы также можете (хотя это может показаться немного злым) прослушать явные изменения свойств Thickness (которые вы не инициировали) и принудительно вернуть их к значению, указанному в AugmentedThickness.

0 голосов
/ 25 апреля 2010

Не могли бы вы сохранить словарь, где ключом является хеш-код структуры?

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