2009-04-05 4 views
0

이미지 크기에 대한 계산을 수행하는 기본 클래스가 있습니다. 그 클래스를 파생시키고 내 코드에서 사용할 이미지 크기를 미리 정의했습니다. 제가 일하는 동안, 나는 제대로하지 못한다는 강한 느낌을 가지고 있습니다.C# : 파생 클래스를 매개 변수로 전달

이상적으로, 나는 그것의 인스턴스를 만들지 않고도 GetWidth에 대한 매개 변수로 DerviedClass.PreviewSize를 전달하는 것이 이상적입니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     ProfilePics d = new ProfilePics(); 
     Guid UserId = Guid.NewGuid(); 

     ProfilePics.Preview PreviewSize = new ProfilePics.Preview(); 
     d.Save(UserId, PreviewSize); 
    } 
} 

class ProfilePicsBase 
{ 
    public interface ISize 
    { 
     int Width { get; } 
     int Height { get; } 
    } 

    public void Save(Guid UserId, ISize Size) 
    { 
     string PicPath = GetTempPath(UserId); 
     Media.ResizeImage(PicPath, Size.Width, Size.Height); 
    } 
} 

class ProfilePics : ProfilePicsBase 
{ 
    public class Preview : ISize 
    { 
     public int Width { get { return 200; } } 
     public int Height { get { return 160; } } 
    } 
} 
+0

클래스 사용 방법에 대한보다 완벽한 예를 보여줄 수 있습니까? –

+0

Neil에게 답변 해 주셔서 감사합니다. 필자는 상황을보다 정확하게 반영하기 위해 예제를 업데이트했습니다. (ProfilePicsBase는 별도의 프로젝트에있는 클래스이므로 프로젝트 별 프로젝트를 만들기 위해 파생 된 이유입니다.) –

+1

변수에 파스칼 케이스 (초기 대문자)를 사용하고 있다는 사실은 ... –

답변

7

ISize의 더 유연한 구현을 원하는 것 같습니다. 항상을 반환하는 구현은 상당히 무의미한 것처럼 보입니다. 반면에 미리보기를 위해 항상 사용하는 크기를 쉽게 얻을 수있는 방법을 원한다는 것을 알 수 있습니다. 나는 이런 식으로 할 것 :

// Immutable implementation of ISize 
public class FixedSize : ISize 
{ 
    public static readonly FixedSize Preview = new FixedSize(200, 160); 

    private readonly int width; 
    private readonly int height; 

    public int Width { get { return width; } } 
    public int Height { get { return height; } } 

    public FixedSize(int width, int height) 
    { 
     this.width = width; 
     this.height = height; 
    } 
} 

당신은 쓸 수 있습니다 : 당신이 그것을 호출 할 때마다

ProfilePics d = new ProfilePics(); 
Guid userId = Guid.NewGuid(); 

d.Save(userId, FixedSize.Preview); 

FixedSize의 동일한 인스턴스를 재사용한다.

+0

그게 바로 제가 찾던 것입니다. 정말 고마워! 왜 내가 머리를 감쌀 수 없었는지 모르겠다. –

+0

Jon - 공개 읽기 전용 속성이 있어야하지만 ProfilePics 클래스가 너비와 높이에 액세스합니다. –

+0

아, 예 - 편집 중. –

3

필요에 따라이를 수행 할 수있는 몇 가지 방법이 있습니다. 다른 인터페이스 설정을 살펴볼 것입니다. 이 같은.

public interface ISizedPics 
{ 
    int Width {get; } 
    int Height {get; } 
    void Save(Guid userId) 
} 
pubic class ProfilePics, iSizedPics 
{ 
    public int Width { get { return 200; } } 
    public int Height { get { return 160; } } 
    public void Save(Guid UserId) 
    { 
     //Do your save here 
    } 
} 

그런 다음이 작업을 수행하면 실제로 이와 같이 작업 할 수 있습니다.

ISizedPics picInstance = new ProfilePics; 
Guid myId = Guid.NewGuid(); 
picInstance.Save(myId); 

이 그 일의 한 방법입니다, 당신이 쉽게 필요에 따라 인스턴스를 선언하는 데 도움이 주변에 공장 클래스를 만들 수 있습니다,이 방법을 좋아한다.

관련 문제