정적 방법에는 인터페이스/추상 클래스
-
08-06-2019 - |
문제
첫째,이해하는 이유 인터페이스 또는 추상 클래스(니다.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( 편집: 다만 생각 나는 것을 언급하는 경우에 그것이 지 않았 오타,나는 그것을 기대하는,그래서 아무 문제 없습니다!)