2016-10-18 1 views
1

그래서 난이 간단한 클래스가 :내부 클래스로서 IComparer를 구현하는 방법을

public class Mobile : IComparable 
{ 
    private string _manufactor; 
    private int _model; 
    private decimal _price; 

    public Mobile(string manufactor, int model, decimal price) 
    { 
     _manufactor = manufactor; 
     _model = model; 
     _price = price; 
    } 

    public int CompareTo(object obj) 
    { 
     return _price.CompareTo((obj as Mobile)._price); 
    } 

    public class MobileModelComparer : IComparer 
    { 
     public int Compare(object x, object y) 
     { 
      return (x as Mobile)._model - (y as Mobile)._model; 
     } 
    } 
} 

당신이 compare_model 특성에 따라 객체 Mobile 2 사이를 구현하는 내부 클래스 MobileModelComparer 필요성을 볼 수 있듯이.

내 질문은 어떻게이 Compare 방법에서 메인에 도달하는 것입니다?

IComparer comparer = new Mobile.MobileModelComparer(); 
+0

"나는 시도를'Mobile.MobileModelComparer'는"당신은 그것을 어떻게하려고 했습니까? 어떤 오류가 발생합니까? 'new Mobile.MobileModelComparer();'는 잘 작동 할 것입니다. –

+0

잘 모르겠다 ...이게 작동해야한다 :'var mobileModelComparer = new Mobile.MobileModelComparer(); MobileModelComparer.Compare (x, y);' – Krumelur

답변

2

당신은 MobileModelComparer의 인스턴스를 생성해야합니다 : 당신이 네임 스페이스에 있었다처럼 하나를 생성 할 수 있도록

I try Mobile.MobileModelComparer 
+1

마지막 줄은'MobileModelComparer'가 중첩 된 클래스이기 때문에'Mobile.MobileModelComparer.Instance.Compare (a, b)'이어야합니다. 개인적으로, 내가이 패턴을 할 때 당신은'Mobile.ComparerInstance.Compare (a, b)'를 할 수 있도록 외부 클래스에 싱글 톤을 두었습니다. –

+0

@ScottChamberlain 의견을 주셔서 감사합니다! 두 항목 모두 완벽합니다. – dasblinkenlight

+0

아주 좋은 답변이지만, 나는 의심의 여지가있다. 비교 방법은 모바일 객체 값에 적용되며, 기본 클래스 생성자가 먼저 호출되기 때문에 이미 만들어 질 것이다. 그래서 우리는 왜 MobileModelComparer 인스턴스를 생성해야 하는가? 우리는 또한 모바일의 인스턴스를 만들 수 있습니다, 명확히하십시오. –

0

모든 내부 클래스 수행은 이름 범위 지정을 변경합니다. 인스턴스가 필요할 때마다 new을 사용할 수 있습니다. 객체가 어떤 상태, 그것을 만드는이 없기 때문에 그러나, 정적 읽기 전용 인스턴스가 작동합니다 :

public class MobileModelComparer : IComparer { 
    public static IComparer Instance {get;} = new MobileModelComparer(); 
    ... // The rest of your code 
} 

는 이제 다른 방법으로 Mobile.MobileModelComparer.Instance.Compare(a, b)

을 사용할 수 있습니다, 당신은 Instance이 같은 Mobile의 속성을 만들 수 :

public static IComparer ModelComparer {get;} = new MobileModelComparer(); 
public class MobileModelComparer : IComparer { 
    ... // The rest of your code 
} 

과 같이 사용 : Mobile.ModelComparer.Compare(a, b)

참고 : 버전 6 Instance를 만들기 위해 정적 읽기 전용 필드 {get;}를 제거하고 readonly를 추가 C#의 경우 이전에 :

public static readonly IComparer Instance = new MobileModelComparer(); 
관련 문제