Вопрос, который я хочу задать, таков:
Является ли приведение дерева наследования (т. Е. К более специализированному классу) из абстрактного класса извиняемым или даже хорошим делом, или это всегда плохой выбор с лучшими доступными опциями?
Теперь пример того, почему я думаю, что это можно использовать навсегда.
Я недавно реализовал Бенкодирование из протокола BitTorrent в C #. Достаточно простая проблема, как представить данные. Я решил сделать это так,
У нас есть класс abstract BItem
, который обеспечивает некоторые базовые функциональные возможности, включая static BItem Decode(string)
, который используется для декодирования зашифрованной строки в необходимую структуру.
Существует также четыре производных класса: BString
, BInteger
, BList
и BDictionary
, представляющих четыре различных типа данных, которые должны быть закодированы. Теперь вот сложная часть. BList
и BDictionary
имеют аксессоры this[int]
и this[string]
соответственно для обеспечения доступа к свойствам массива этих типов данных.
Потенциально ужасная часть идет сейчас:
BDictionary torrent = (BDictionary) BItem.DecodeFile("my.torrent");
int filelength = (BInteger)((BDictionary)((BList)((BDictionary)
torrent["info"])["files"])[0])["length"];
Ну, вы поняли ... Ой, это тяжело для глаз, не говоря уже о мозге. Итак, я ввел что-то дополнительное в абстрактный класс:
public BItem this[int index]
{
get { return ((BList)this)[index]; }
}
public BItem this[string index]
{
get { return ((BDictionary)this)[index]; }
}
Теперь мы можем переписать этот старый код как:
BDictionary torrent = (BDictionary)BItem.DecodeFile("my.torrent");
int filelength = (BInteger)torrent["info"]["files"][0]["length"];
Ух ты, эй престо, НАМНОГО более читаемый код. Но продал ли я часть своей души за то, что подразумевал знание подклассов в абстрактном классе?
РЕДАКТИРОВАТЬ: В ответ на некоторые ответы приходят, вы совершенно не в курсе этого конкретного вопроса, так как структура является переменной, например, мой пример torrent["info"]["files"][0]["length"]
является действительным, но так же, как и torrent["announce-list"][0][0]
, и и то и другое будет в 90% торрент-файлов. Дженерики - не лучший способ решить эту проблему, по крайней мере :(. Перейдите по ссылке на спецификацию, которую я связал, она всего 4 маленьких точки.