'패자'입력 C#에서 주조에 의해 아래로 상속 트
-
09-06-2019 - |
문제
질문을 물어보고 싶은 따라서:
은 주로 상속 트리니다(즉,.더 specialiased 래)내에서 추상 클래스는 면죄,또는 좋은 일이나 그것은 항상 가난한 선택으로 더 나은 옵션을 사용할 수 있습니까?
지금은,예를 왜 나는 생각은 그것을 사용할 수 있습니다.
나는 최근에 구현 Bencoding 에서 비 프로토콜 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"];
만,당신은 사진을 얻을...Ouch,는,눈에 언급하지 않는다.그래서 나는 소개가 추가로 추상 클래스:
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"];
Wow,헤레스토 훨씬 읽기 코드입니다.하지만 난 그냥 판매하는 부분의 내 영혼에 대한 의미의 지식에 하위 클래스로 추상 클래스가?
편집:에 대한 응답의 일부 응답에,당신은 완전히 떨어져,이는 특정 질문은 이후 구조 변수에 대한 인스턴스 내의 예 torrent["info"]["files"][0]["length"]
유효하지만,그렇게 torrent["announce-list"][0][0]
, 모두 될 것이 90%에서는 토렌트파일이있다.제네릭지 않는 이동하는 방법으로,이 문제 적어도:(.가를 통해 클릭 스펙 내가 연결되어,그것은 단지 4 개의 작은 도 점이 큽니다.
해결책
나는 생각을 만들 것이[int]이[string]접근 가상과 재정이 그들에 BList/BDictionary.클래스에는 접근하지 않습 감각해 코드 액세스 보안을 통해 보호()(아마도함으로써 기본적으로 구현에 BItem).
는 당신의 코드 작업에서 동일한 방법은 당신이 더 읽기 오류의 경우 작성해야
(BInteger)torrent["info"][0]["files"]["length"];
실수.
다른 팁
당신이 정말로 해야에 액세스하지 않는 모든 파생된 클래스에서 기본 클래스로 꽤 많은 휴식의 아이디어 OOP.일기 좋게 확실히 먼 길을 간다,그러나 내가 무역하지 않을 것 그것을 위해 재사용이 가능.경우를 고려해야 할 때 다른 추가 서브 클래스-당신은 또한 필요를 업데이트한 기본 클래스에 따라.
는 경우 파일의 길이는 당신이 뭔가를 검색,자주 이유를 이행하지 않을 시에 BDictionary(?) 클래스...그래서 당신은 코드가 됩:
BDictionary torrent = BItem.DecodeFile("my.torrent");
int filelength = torrent.FileLength;
는 방법으로 구현 정보는 사용자에게 표시되지 않습니다.
방법은 내가 그것을 모든 BItems 컬렉션,따라서 모든 BItems 가 인덱도록,인덱에 안 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;
았다 당신이 가장 중독성 전투의 분석을 간단한"path"그래서 당신은 쓸 수 있었다 그것은 이 방법:
BDictionary torrent = BItem.DecodeFile("my.torrent");
int filelength = (int)torrent.Fetch("info.files.0.length");
아마도 가장 좋은 방법이지만,가독성 증가(a little)
- 완전히 제어할 수 있는 경우에 당신의 코드고 생각 공정에 의해 모든 것을 의미 않습니다.
- 하지 않을 경우,당신은 후회할이 날이 새로운 사람은 삽입 BItem 유도는 당신이 보지 않으로 오 귀하의 BList 또는 BDictionary.
당신이해야 할 경우 이이어야 포장(액세스 제어 목록)클래스에서는 강하게 입력한 메서드 서명이 있습니다.
BString GetString(BInteger);
SetString(BInteger, BString);
동의 및 반환 BStrings 하더라도 당신 내부에 저장 BList 의 BItems. (자 분 전에 내 2B 나지 않 2B)
Hmm.그만큼 우리는 첫 번째 라인의 코딩하기가 더 쉽 두 번째 그것이 조금 더 걸리게 무슨 일이 일어나고 있는지 알아 내지만,그것의 더 명백하는 당신을 치료체 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 cast'토렌트'으로 선언 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"];
는 나쁜 첫 번째로 많이