문제

첫째,이해하는 이유 인터페이스 또는 추상 클래스(니다.NET/C#용어)이 있을 수 없는 추상 정적 방법입니다.나의 질문은 다음에 더 초점을 맞춘 최고의 디자인 솔루션을 제공합니다.

내가 무엇을 원하는 설정의"helper"클래스는 모두가 자신의 정적 방법 등으면 나는 개체는 A,B,C 에서 타사 공급업체가 있을 수 있는 도우미 클래스와 같은 방법

AHelper.RetrieveByID(string id);
AHelper.RetrieveByName(string name);
AHelper.DumpToDatabase();

이후 내 AHelper,BHelper 및 CHelper 클래스는 모든 기본적으로 같은 방법,그것을 이동 방법의 인터페이스는 이러한 클래스에서 파생.그러나,원하는 이러한 방법을 정적 제외에서 나는 일반 인터페이스 또는 추상 클래스들 모두에서 파생.

난 항상 만들 수 있습니다 이러한 방법은 정적이 아닌 및 그 개체를 인스턴스화 번째 등

AHelper a = new AHelper();
a.DumpToDatabase();

그러나,이 코드는 보이지 않으로 직관적이다.당신의 제안은 무엇인가?해야 하기 인터페이스를 사용하여 또는 추상 클래스의 전부(상황에서 난 이제)또는 이런 것이 가능할 수 있 리팩터링을 달성하는 디자인을 찾고 있습니까?

도움이 되었습니까?

해결책

귀하의 응답 나는 생각하고 따라 다음과 같은 라인:

  • 할 수 있는 정적 방법을 취하는 입력 매개변수행상의 논리에 따라 형식입니다.
  • 을 만들 수 있습 방법은 가상의 추상적인 기본을 지정하는 SQL 콘크리트에서 클래스입니다.그래서를 포함하는 모든 일반적인 코드는 모두가 필요로(예:exectuting 명령 객체를 반환)는 캡슐화하는"전문가"비트(예:SQL)서브 클래스입니다.

내가 선호하는 두 번째 옵션이 있지만,그것의 과정을 아래로 당신입니다.필요한 경우로 가기 위하여 나를 더 세부사항,알려주시기 바랍어/편집 업데이트:)

다른 팁

내가 당신이라면 나는 것을 방지하려고 어떤 통계.이럴 때문의 일종으로 동기화 문제는 도로의 아래 정적.는 말을 제시하고 전형적인 예의 일반 프로그램을 사용하여 템플릿을 합니다.내가 채택한 템플릿을 기반의 솔루션을 강탈 구리시에서 하나의 게시물이다.

에 대한 일반적인 솔루션을를 들어,당신은 작업을 수행 할 수 있습니다:

public static T RetrieveByID<T>(string ID)
{
     var fieldNames = getFieldNamesBasedOnType(typeof(T));
     QueryResult qr = webservice.query("SELECT "+fieldNames + " FROM "
                                     + tyepof(T).Name
                                     +" WHERE Id = '" + ID + "'");
     return (T) qr.records[0];
}

나 개인적으로 아마 질문이 왜 종류의 각각 필요가 있는 정적 방법을하기 전에 심지어는 생각이 더..

왜 만들어지지 않습 utlity 등으로 정적인 방법들을 공유할 필요가?(예: ClassHelper.RetrieveByID(string id)ClassHelper<ClassA>.RetrieveByID(string id)

내 경험에서 이러한 종류의"장애물"문제가 아니한 언어로,그러나 제한의 디자인을하고 있습니다..

는 방법은 ObjectA 및 AHelper 관련?가 AHelper.RetrieveByID() 같은 논리로 BHelper.RetrieveByID()

그렇다면,방법에 대한 유틸성 클래스를 기반 접근법(클래스로 공공 정적 방법을만하고 아무 상태)

static [return type] Helper.RetrieveByID(ObjectX x) 

할 수 없습니다 과부하는 방법에 의해 다양한 단지 반환 유형입니다.

당신은 서로 다른 이름을 사용할 수 있습니다:

static AObject GetAObject(string id);
static BObject GetBObject(string id);

또는 당신은 클래스를 만들 수 있습으로 캐스팅 연산자

class AOrBObject
{ 
   string id;
   AOrBObject(string id) {this.id = id;}

   static public AOrBObject RetrieveByID(string id)
   {
        return new AOrBObject(id);
   }

   public static AObject explicit operator(AOrBObject ab) 
    { 
        return AObjectQuery(ab.id);
    }

   public static BObject explicit operator(AOrBObject ab)
    { 
        return BObjectQuery(ab.id);
    } 
}

다음 호출할 수 있습니다.

 var a = (AObject) AOrBObject.RetrieveByID(5);
 var b = (BObject) AOrBObject.RetrieveByID(5); 

C#3.0,정적 방법을 사용할 수 있습에서 인터페이스는 경우에 그들은 그들의 일부를 사용하여 확장해 최선을 다하고 있으로 DumpToDatabase()below:

static class HelperMethods
 {  //IHelper h = new HeleperA();
    //h.DumpToDatabase() 
    public static void DumpToDatabase(this IHelper helper) { /* ... */ }

    //IHelper h = a.RetrieveByID(5)
    public static IHelper RetrieveByID(this ObjectA a, int id) 
     { 
          return new HelperA(a.GetByID(id));
     }

    //Ihelper h = b.RetrieveByID(5)       
    public static IHelper RetrieveByID(this ObjectB b, int id)
     { 
          return new HelperB(b.GetById(id.ToString())); 
     }
 }

어떻게 포스팅에 대한 의견 Stack Overflow?편집본을 게시 또는 게시하는"대답이"?어쨌든 난 생각할 수 있을 제공하는 데 도움의 예에서 무슨 AHelper.RetrieveByID()및 BHelper.RetreiveByID()

기본적으로,두 방법 모두에 대해 거슬러 올라가는 타사 웹 서비스를 반환하는 다양한 일반(castable)객체 쿼리를 사용하는 방법에 걸리는 의사 SQL 문자열을 유일한 매개 변수입니다.

그래서,AHelper.RetrieveByID(string ID 와)같습니다

public static AObject RetrieveByID(string ID)
{
  QueryResult qr = webservice.query("SELECT Id,Name FROM AObject WHERE Id = '" + ID + "'");

  return (AObject)qr.records[0];
}

public static BObject RetrieveByID(string ID)
{
  QueryResult qr = webservice.query("SELECT Id,Name,Company FROM BObject WHERE Id = '" + ID + "'");

  return (BObject)qr.records[0];
}

희망이 있는 도움이 됩니다.당신이 볼 수 있듯이,두 가지 방법은 비슷하지만,쿼리할 수 있는 꽤 다양에 따라 다른 물체 종류는 반환됩니다.

Oh,강탈,나는 완전히 동의-이 보다 더 많은 가능성이 제한 나의 디자인과하지 않는 언어입니다.:)

당신은 당신을 찾는 다형 동작?다음 당신이 원하는 인터페이스와 정상적인 생성자입니다.무슨 휴대 전화에 대해 생성자를 호출하?지 않는 경우에 필요한 다형성(소리처럼 당신은 그것을 사용하지 않는 지금),할 수 있습니다 다음 지팡이와 함께 귀하의 정적 방법입니다.는 경우 이러한 모든 래퍼 공급업체 구성 요소,어쩌면 당신이 시도할 수 있는 사용하는 공장을 만들 수 있는 방법들을 다음과 같 VendorBuilder.GetVendorThing("A")을 반환할 수 있는 개체의 유형 IVendorWrapper.

marxidad 그냥 빠른점을 참고,저스틴은 이미 말했다는 SQL 다양 많이 의존하는 유형에,그래서 내가 일 기준으로는 뭔가 될 수 있습니다 다른 의존하는 유형에 따라서 위임하에 그것을 서브 클래스에서 질문입니다.반면의 솔루션을 커플 SQL 에 단단히 Type(즉그 SQL).

rptony 좋은 지점에서 가능한 동기화 문제로 정적 하나를 언급하지 못하는,그래서 감사합니다:)또한,Rob Cooper (구리)BTW;):D( 편집: 다만 생각 나는 것을 언급하는 경우에 그것이 지 않았 오타,나는 그것을 기대하는,그래서 아무 문제 없습니다!)

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