2009-11-10 9 views
1

다시 책임의 한계 면책 조항 여전히 C# 및 OOP는 일반적으로 그래서 당신이 날 :)과 인내심 바랍니다 학습초급 : C#으로 수업을 확장했는데 잘못 했습니까?

나는 현재 기본적으로 관련된 속성의 목록을 포함 FileVersion라는 클래스가있는 CMS 함께 일하고 파일 크기, 바이트 수, ID, 업로드 날짜, 최신 버전 등의 파일에 저장합니다.

의 목록은 고유 한 고유 ID가있는 File 내에 있습니다.

내가 작업 (문서입니다 파일을 특별히 처리)하고있어 특정 제어를위한 지금
string URL = "/files/"+file.id.toString()+"/"+file.fileVersion.Last().filename; 

, 그것은 : 당신은 CMS에서 특정 파일을 다운로드 할 때, URL은 다음과 같은 것을 사용하여 구축 나중에 사용하기 위해 다른 모든 FileVersion 정보와 함께 URL을 저장할 수 있어야합니다. 그래서 내가 결정하기로 한 것은 이라고하는 자신의 클래스를 만들어서 FileVersion으로 확장하는 것입니다. 하지만 내가 여기 왜 복음으로, 즉 있다고하지 않습니다 -

public partial class DocumentVersion : FileVersion 
{ 
    public DocumentVersion() : base() { } 
    public string link; 
} 

가 지금은주의해야한다 내가 여기에 인터페이스를 구현하지 않아도 나타납니다 :이처럼 보이는 것입니다.

그러나 나는 DocumentVersion과 같이 나의 FileVersion 캐스팅하려고하면

DocumentVersion dv = ((DocumentVersion)fileversion); 

나는 다음과 같은 예외가 얻을 :

유형 의 개체를 캐스팅 할 수 없습니다 'Foo.CMS.FileVersion을 '을 입력하여 'CoA.DocumentVersion '을 입력하십시오.

내가 원래의 위치에서 다른 네임 스페이스로 클래스를 확장하려고했기 때문에 내 오해가 생길 수있다.하지만 내가 말한 것처럼 OOP는 나에게 비교적 새로운 것이므로 잘못 될 수있다.

미리 도움을 주셔서 감사합니다. 이 커뮤니티는 매우 귀중했습니다. 나는 한 번 더 숙련 된 사람이라면 다시 돌려 줄 수 있기를 바랍니다. :)

+0

'FileVersion'에 대한 클래스 선언을 포함하도록 질문을 편집 할 수 있습니까? 당신은 그것을 확장 할 수 없을 수도 있습니다. –

+0

나는 러스를 좋아할 것이지만 불행히도'FileVersion'에 대한 클래스 선언이 소스가없는 dll에 있기 때문에 나는 할 수 없습니다. 일반적으로 클래스가 확장 가능한지 여부를 어떻게 알 수 있습니까? –

+0

대단히 감사합니다. 결국 나는 Brian 's를 받아 들였습니다. 왜냐하면 그의 것이 가장 완벽하고 스레드가 끝나는 방식으로 내가 필요한 모든 것을 배웠기 때문입니다. 다시 한 번, 모두에게 감사합니다. –

답변

5

다운 캐스트하려고합니까? 즉, 기존 FileVersion을 가져와 DocumentVersion으로 선언 하시겠습니까?

만약 그렇다면, 가지고있는 것은 FileVersion입니다.

대신 DocumentVersion 개체를 만들어야합니다.DocumentVersion 생성자는 FileVersion에 필요한 인수를 취한 다음 base()을 통해 FileVersion 생성자를 호출합니다.

기존 FileVersion 개체가있는 경우 개체를 파생시키지 않고으로 바꿀 수 있습니다. 예 : DocumentVersionFileVersion에서 파생되지 않으며 FileVersion에 대한 개인 참조와 필요에 따라 추가 데이터가 포함됩니다. 이 시나리오에서 더 적절할 수 있습니다.

public class DocumentVersion { 
    private FileVersion fv; 
    private String url; 
    public DocumentVersion(FileVersion fv, String url) { 
     this.fv = fv; 
     this.url = url; 
    } 
} 

이 구성에 대한 추가 정보를 원하시면 here을 참조하십시오 (OO 측면에서이 구성입니다).

+0

아하! 나는 말 앞에서 카트를 가지고있는 것처럼 보인다! FileVersion을 감싸는 것이 아니라 감싸는 것입니다. 나는 당신이 제안한 것을 확실히 구글로 쓸 것이지만, 만약 그것이 단순한 몇 줄이라면, 이것을 어떻게 할 수 있는지 보여 주시겠습니까? –

+0

위를 참조하십시오. 나는 자바 녀석 이니까 C#이 좀 녹슬 었어. 그러나 위는 당신에게 아이디어를 줄 것입니다. –

+0

줄 바꿈 : DocumentVersion 클래스에는 저장할 FileVersion 및 추가 필드를 가리키는 인스턴스 변수가 포함됩니다. 문제는이 DocumentVersion을 직접 저장해야한다는 것입니다. 기존 FileVersion 또는 File에 첨부 할 수는 없습니다. 따라서, 추가 정보를 저장하기 위해 자신의'Dictionary '을 생성해야합니다. 물론, 일단 그렇게하면 FileVersion의 FileVersion 참조가 더 이상 필요하지 않습니다. File을 통해 액세스 할 수 있기 때문입니다. – Heinzi

1

아들 (DocumentVersion)처럼 행동하는 아버지 (FileVersion)를 만들 수 없습니다.
당신은 아들을 아버지로 만들 수 있습니다.

(의 FileVersion) documentVersion // 유효
(DocumentVersion)의 FileVersion // (FILEVERSION 파생 유형이 물건에 대해 알고 할 수 없기 때문에) 무효

OOP의 기본이다

.

1
DocumentVersion dv = null; 

if (fileversion is DocumentVersion) 
{ 
    dv = fileversion as DocumentVersion; 
} 
4

당신의 FILEVERSION 변수가의 FileVersion 아닌 DocumentVersion이 포함되어 있기 때문에 당신은 당신의 FileVersionDocumentVersion에 캐스팅 수 없습니다.

  • 모든 DocumentVersion가의 FileVersion이지만,
  • 없음마다의 FileVersion은 DocumentVersion입니다 : 상속 다음과 같은 의미!

개체가 FileVersion으로 만들어진 경우 FileVersion 일뿐입니다. 기간. DocumentVersion으로 만든 경우 FileVersion (위의 규칙 1 참조), 을 사용할 곳 어디에서나 DocumentVersion 기능을 사용할 수 있습니다.

FileVersion 객체를 만들 때 코드 부분을 제어하는 ​​경우 DocumentVersion을 만들어야합니다. 그러면 캐스트가 작동합니다. 이러한 DocumentVersions는 모든 DocumentVersion이 FileVersion이기 때문에 FileVersions와 동일한 목록에 저장할 수 있습니다.


편집 : DocumentVersion = 개와의 FileVersion = 동물 : 위의 두 가지 규칙이 OO 원리를 이해하는 데 매우 중요하기 때문에, 내가 예와 개념을 설명 할 수 있습니다. 그렇다면 위의 규칙은 다음과 같습니다 : (1) 모든 개는 동물이지만 (2) 모든 동물이 개는 아닙니다. 그래서, 동물 목록을 만들고 거기에 모든 종류의 동물 (개, 고양이, 그냥 "동물"...)을 저장할 수 있습니다. 그러나 동물의 변수를 개에 던지기는 불가능합니다. 개가 (또는 푸들 (클래스 푸들 : 개))로 작성되었으며, 은 규칙 (1)에 따라 개)입니다. OO의 측면에서

: 당신이 형 동물의 변수에 개를 저장하는 경우, 다음 정적 유형 객체의는 "동물"이며, 동적 유형는 "개"입니다. 요소의 동적 유형이 T 또는 그 하위 유형 인 경우에만 요소를 유형 T로 형변환 할 수 있습니다.

1

(대부분의 답변에서 말한대로 캐스팅 할 수 없습니다. FileVersionDocumentVersion이 무엇인지 전혀 모릅니다.)

: 그것을 해결하기 위해

한 가지 방법은 DocumentVersion

public partial class DocumentVersion : FileVersion 
{ 
    public DocumentVersion() : base() { } 

    public DocumentVersion(FileVersion version) : this() 
    { 
     this.id = version.id; 
     // etc. 
    } 

    public string Link { get;set; } 
} 

의 생성자에서 필드를 복사하거나 당신이 그것을 제공하는 FileVersion에서 DocumentVersion을 반환 DocumentVersion에 정적 방법, 예를 만드는 것입니다

public static void New(FileVersion version) 
{ 
    this.id = version.id; 
    // etc. 
} 

언급 된 또 다른 기술은 조성이다. 당신이 DocumentVersionFileVersion을 변환 할 수 없기 때문에 당신은 DocumentVersion

public class DocumentVersion 
{ 
    public FileVersion FileVersion { get;set; } 
    public string Link { get;set; } 
} 
0

에 속성으로 FileVersion를 저장하고 당신이해야 할 모든이가 FileVersion 소요, 당신은 extension method을 만들 수있는 URL을 얻을 수있는 방법을 추가 할 수 있습니다 :

public static string GetLink(this FileVersion fileVersion) { 
    return "/files/"+fileVersion.id.ToString()+"/"+fileVersion.FileVersion.Last().Filename 
} 

참고 : 이것은 C# 3.0을 사용하는 경우에만 작동합니다.

관련 문제