문제

질문을 물어보고 싶은 따라서:

은 주로 상속 트리니다(즉,.더 specialiased 래)내에서 추상 클래스는 면죄,또는 좋은 일이나 그것은 항상 가난한 선택으로 더 나은 옵션을 사용할 수 있습니까?

지금은,예를 왜 나는 생각은 그것을 사용할 수 있습니다.

나는 최근에 구현 Bencoding 에서 비 프로토콜 C#.충분히 간단한 문제는 어떻게 나타내는 데이터입니다.내가를 수행하기로 결정했다는 이 방법은,

abstract BItem 클래스를 제공하는 몇 가지 기본적인 기능을 포함하여, static BItem Decode(string) 는 디코딩하는 데 사용되는 버그를 수정했 문자열로 필요한 구조입니다.

도 있 네 파생 클래스 BString, BInteger, BListBDictionary, 을 나타내는 네 개의 서로 다른 데이터의 유형을 인코딩할.이제 여기에 까다로운 부분입니다. BListBDictionarythis[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]{&nbsp; &nbsp; get { return ((BList)this)[index]; }}public BItem this[string index]{&nbsp; &nbsp; get { return ((BDictionary)this)[index]; }}

이러한하지 않 달성하고 원하는 결과를 리턴 유형으로 여전히 abstrat 버전은,그래서 당신은 여전히 있다.

의 다시 작성 코드 할 것

BDictionary torrent = BItem.DecodeFile("my.torrent");int filelength = (BInteger)((BList)((BDictionary)torrent["info"]["files"])[0])["length"];

는 나쁜 첫 번째로 많이

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top