2011-02-15 3 views
6

예를 들어 파일 경로를 사용하고 문자열을 사용하는 두 가지 방법으로 객체를 초기화 할 수 있습니다. 일반적으로 두 생성자는 하나의 문자열 매개 변수 MyObject(string file)MyObject(string content)을 가져야하지만이 방법은 과부하가 불가능합니다. 너는 무엇을 제안 하는가?두 개의 생성자 오버로드를 만드는 방법은 둘 다 단 하나의 문자열 매개 변수를 사용합니까?

: 첫 번째 경우 파일 경로도 필요하므로 파일 콘텐츠를 읽고 다른 생성자에 콘텐츠를 전달하는 솔루션을 제안하지 마십시오.

+2

문자열 유형 중 하나를 자체 클래스로 감싸고 대신 해당 유형을 매개 변수로 사용하십시오. –

+0

@Cody Grey : 안녕하세요, 그 장점이 답이라고 생각합니다. –

+0

마크 바이어스 (Mark Byers)가 제공 한 솔루션이이 경우 가장 좋은 솔루션이라고 생각하기 때문에 답변으로 게시하지 않았습니다. (나는 그 대신 하나를 upvoted.) 대신 작업을 수행 할 수있는 유형이 내장되어있는 경우 추가 래퍼 클래스를 만들 필요가 없습니다. 좀 더 일반적인 응용 프로그램의 경우, 제 제안은 아마도 갈 방법입니다. –

답변

10

은 아마 당신은 받아 들일 처음 변경할 수있는 FileInfo 대신 :

class MyObject 
{ 
    public MyObject(FileInfo file) { /* etc... */ } 
    public MyObject(string content) { /* etc... */ } 
} 

... 

MyObject o = new MyObject(new FileInfo(filename)); 
+0

또는 더 일반적으로는 하나를 감싼다. 그 자체의 클래스에서 문자열 타입을 사용하고 그 타입을 매개 변수로 대신 받아 들일 수 있습니다 (이 경우 래퍼는 FileInfo입니다) –

15

나는 C#을 프로그래머가 아니에요 그러나 이것은 static factory method 패턴 작업과 같습니다 그런

class MyObject { 
    public static MyObject FromContent(string content) { 
    return new MyObject(content); 
    } 

    public static MyObject FromFile(string path) { 
    return new MyObject(ReadContentFromFile(path)); 
    } 
} 

을 할 수있다

MyObject object = MyObject.FromFile("/some/path"); 

이것은 사용하는 것보다 훨씬 읽기 쉽습니다. 정규 생성자.

+0

똑똑한 마음 ... –

+0

두 번째 경우에는 여전히 경로가 필요합니다. 이 패턴을 사용하십시오. –

+0

어쨌든이 문제가 있습니까? MyObject가 경로에서 생성되지 않은 경우 null을 반환하는 MyObject.GetPath()를 사용하지 않는 이유는 무엇입니까? – sjr

1

또는 만들 공장 방법 :

public static MyObject CreateByFilePath(string path){ ... } 
public static MyObject CreateByContent(string content){ ... } 
1

은 어쩌면 당신은 공장을 사용할 수 있습니까?

class MyObjectProvider 
{ 
    public static MyObject CreateByPath(string path) 
    { 
     return new MyObject 
       { 
        Path = path; 
       }; 

    } 

    public static MyObject CreateByContent(string content) 
    { 
     return new MyObject 
       { 
        Content = content; 
       }; 
    } 
} 
0
public MyObject(Uri fileUri); 
public MyObject(string content); 
0

나는 반대 의견 접근을하고 그것을하지 않습니다 말할 것이다. 지금까지 게시 된 최고의 솔루션 (과부하 중 하나에 대해 FileInfo 또는 Uri와 같은 대체 유형 사용)은 나에게 조금 해킹 된 것 같습니다. 최소한의 놀라움의 원칙에 어긋납니다.

파일 이름없이 내용 만 사용하여 구성 할 수 있다면 파일 이름이 반드시 필요한 것은 아닙니다. 마찬가지로 파일 이름만으로 구성 할 수 있다면 콘텐츠가 필수적인 것은 아닙니다. 예를 들어 나중에 누락 된 파일 이름/콘텐츠를 나중에 설정할 수 있습니다.

MyObject myObject = new MyObject(fileName); 
myObject.Content = ... 

MyObject myObject = new MyObject(content); 
myObject.FileName = ... 

대신 싸울려고 노력의 가장 중요한 (다음 예제 파일 이름) 인 것으로 당신의 매개 변수 중 하나를 선택하고 다음과 같이 두 constructurs를 만들 : 속성을 설정하여

public MyObject(string fileName) : this(fileName, null) 
{ 
} 

public MyObject(string fileName, string content) 
{ 
    ... implementation 
} 

하나 또는 두 매개 변수에 대해 합리적인 경우 널 (null)이 전달되도록 할 수 있습니다. 그리고 당신은 적절하다면 적어도 하나는 null이 아니라고 주장 할 수 있습니다

public MyObject(string fileName, string content) 
{ 
    if (fileName == null && content == null) throw new ArgumentException(...); 
    ... 
}  

즉,이 같은 제한을 피해 갈 해킹을 사용하지 마십시오.

관련 문제