'憲'タイピングクライアントまで、フルのC#による鋳造を継承ツリー
-
09-06-2019 - |
質問
質問をお願いしたいですがこのように:
カントリーリスクを継承ツリー(ie.に向けてspecialiasedクラス)から内部クラスはabstractクラスexcusableでも、いつでも貧しい選択により良いオプションできますか?
今の例ではなぜだと思い利用できないようにしてください。
私は最近実施 BencodingからのBitTorrentプロトコル クライアントまで、フルのC#.簡単な問題にどのように表現される。私はいまこのように、
しており abstract BItem
クラスは、基本的な機能を含む、 static BItem Decode(string)
のに使用した読み取り、rfidタグの読み書Bencoded文字列に必要な構造です。
ものであ派生クラス BString
, BInteger
, BList
や BDictionary
, 表のデータ型エンコードされています。現在、このトリッキーです。 BList
や BDictionary
してい this[int]
や this[string]
accessorsそれぞれのアクセスを可能とするために、配列のような性質のこれらのデータです。
この恐ろしい部分ならでは:
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%のtorrentファイルがあります。ジェネリック医薬品なので、この問題◎:(.してクリックして、スペックしリンクする4つの小さなドット-ポイント。
解決
と思い、この"int】この[string]accessors仮想およびオーバーライドしてBList/BDictionary.授業のaccessorsな意味ではキャストNotSupportedException()(ろによりデフォルトの実装BItem).
このコードを同じ方法で読みやすくするためにエラーの場合も書き
(BInteger)torrent["info"][0]["files"]["length"];
するものとします。
他のヒント
まずアクセス由来のクラスの基底クラスではかなり違うのOOP.Readibility確かなどを水でよく練りあわせ、長い道がないの貿易で再利用性.検討の場合だけ追加する必要があり他のサブクラスもご利用いただけ更新する必要がある基底クラスです。
ファイルの長さのものを取得しばしばな実施中のプロパティのBDictionary(?) クラ---ようにコードにつなが
BDictionary torrent = BItem.DecodeFile("my.torrent");
int filelength = torrent.FileLength;
この実装の詳細に隠れからのユーザーです。
のんので、BItemsは、このようなBItemsてインデクサに最適で、indexerれないようにBItem.いるもの抽象クラスからBItem,分かりやすい名前をつけましょうBCollection置のインデクサに最適であのようなもの:
abstract class BCollection : BItem {
public BItem this[int index] {get;}
public BItem this[string index] {get;}
}
やBListとBDictionaryからは継承しBCollection.やばくっているという感覚を持っていくBCollection汎用クラスです。
私のお薦めいを導入することが考えられる以上に抽象化.だくことBItemはDecodeFile()を返しますBDictionary.この合理的なものなの激流が、わかりません。
しかし、私が見るapiは以下のようなよりリーズナブルな:
BFile torrent = BFile.DecodeFile("my.torrent");
int filelength = torrent.Length;
ただconcider解析を簡単に"パス"でも書くこのようになっております:
BDictionary torrent = BItem.DecodeFile("my.torrent");
int filelength = (int)torrent.Fetch("info.files.0.length");
もしかないのが、読みやすさがちょっと)
- い完全管理のコードベースおよび思考プロセスによっいます。
- ない場合は、後悔この日の一部新しい人混るBItem導出する時間がかかります。入 ご BListはBDictionary.
いこのためには、転いたします。(アクセス制御リスト)によるクラスでは、強く型付けされたソースの通称です。
BString GetString(BInteger);
SetString(BInteger, BString);
受け入れを返しBStringsていても、内部で大切に保管してくださBListのBItems. (私の分割前のだいたい2億い2B)
うーん。いうことは最初の行のコードが読みやすくするために-かなる姿を行うので、そのよapparantい処理物としてBListはBDictionary.法を応用した抽象クラスを隠する詳細は、つくることができますが、硬めの姿をどのような方法で実際に行っている。
ご紹介のジェネリック医薬品,させないように指定できます。
class DecodedTorrent : BDictionary<BDictionary<BList<BDictionary<BInteger>>>>
{
}
DecodedTorrent torrent = BItem.DecodeFile("mytorrent");
int x = torrent["info"]["files"][0]["length"];
Hmmを用いたがんの種類により異なる場合がありまのくによる構造です。
はじめましての人ははじめまして
BDictionary torrent = BItem.DecodeFile("my.torrent");int filelength = (BInteger)((BDictionary)((BList)((BDictionary) torrent["info"])["files"])[0])["length"];
必要としないBDictionary鋳'奔流"を宣言したとしてBDictionary
public BItem this[int index]{ get { return ((BList)this)[index]; }}public BItem this[string index]{ get { return ((BDictionary)this)[index]; }}
これらのん占望みの結果として戻り値の型にはまだabstratハロウィンパーティーが開いています。
に書き換えコードについて
BDictionary torrent = BItem.DecodeFile("my.torrent");int filelength = (BInteger)((BList)((BDictionary)torrent["info"]["files"])[0])["length"];
は悪くなりすぎないとして第