2016-07-01 2 views
2

나는 async/await에 완전히 익숙하지 않으며 2 년 전에 작성한 완전히 동기적인 앱을 "개선"해왔다. 나는 나의 해결책에 만족하지 못한다는 다음과 같은 상황을 가지고있다.추상 클래스의 자식에 대해 정적 생성자를 만들 수 있습니까?

XAML은 다음과 같은 두 가지 클래스에 바인딩 :

XAML

private InsuranceEditor _primaryinsurance; 
public InsuranceEditor PrimaryInsurance 
{ 
     get { return _primaryinsurance; } 
     set { if (_primaryinsurance == value) return; _primaryinsurance = value; OnPropertyChanged("PrimaryInsurance"); } 
} 

private InsuranceEditor _secondaryinsurance; 
public InsuranceEditor SecondaryInsurance 
{ 
     get { return _secondaryinsurance; } 
     set { if (_secondaryinsurance == value) return; _secondaryinsurance = value; OnPropertyChanged("SecondaryInsurance"); } 
} 

클래스, PrimaryInsurance 및 SecondaryInsurance 추상 클래스 보험에서 상속 :

abstract class InsuranceEditor : SimpleViewModelBase, ISave, IDataErrorInfo 
{ 
      ................. 
      // Constructor 
    public InsuranceEditor(PatientDemographicsEditor patient, Billing service) 
    { 
     ... 
    } 

공장 패턴 사용을 PrimaryInsurance의 비동기식 건설 (Async OOP Constructor)

private async Task<PrimaryInsurance> InitializeAsync() 
{ 
    // asyncData = await GetDataAsync(); 
    return this; 
} 

public static Task<PrimaryInsurance> Create(PatientDemographicsEditor patient, Billing service) 
{ 
    var ret = new PrimaryInsurance(patient, service); 
    return ret.InitializeAsync(); 
} 

// Constructor 
private PrimaryInsurance(PatientDemographicsEditor patient, Billing service) 
    : base(patient, service) 
{ 
    Editor_Id = 1; 
    ........ 
} 

class SecondaryInsurance : InsuranceEditor 
{ 
    // Constructor 
    private SecondaryInsurance(PatientDemographicsEditor patient, Billing service) 
     : base(patient, service) 
    { 
     Editor_Id = 2; 
     ............................ 
    } 
} 

논리적으로는 기본 및 보조 보험이 모두 Editor_Id 만 다르므로 일반적인 InsuranceEditor에서 상속하는 것이 자연스럽게 보입니다. 이제 문제는 "올바르게"비동기/대기를 1 차 및 2 차 보험에 적용하는 것입니다. (. 반드시 추상 클래스 InsuranceEditor의 정적 메서드) Create(...)PrimaryInsurance의 정적 방법으로 인식되고

PrimaryInsurance = await PrimaryInsurance.Create(....)

가이 작업을 수행 할 수 있습니다 뭔가처럼되고 사용 하시겠습니까?

편집 # 1. 이 질문을 게시 한 후, 나는 이미 질문했을 수 있습니다, 생각하고있어 What's the correct alternative to static method inheritance? 그리고 내가 원하는 것은 C에서 할 수 없습니다. #. 이 올바른지?

편집 # 2 : 나는 VS에 데 문제는 사용 문을 함께 제공 :

PrimaryInsurance = 기다리고 PrimaryInsurance.Create (환자, 빌링);

VS 나에게 그 이야기 :

회원 'InsuranceEditor.Create (PatientDemographicsEditor, 청구)' 인스턴스를 참조하여 액세스 할 수 없습니다; 유형 이름으로 자격을 대신

그리고

그때 VS는 작성 (...) (오류가 없도록)는 달마 티아 InsuranceEditor 클래스에서이 만드는 아닌 PrimaryInsurance 수 있도록 허용하는 경우 수업.

internal Task<InsuranceEditor> Create(PatientDemographicsEditor patient, Billing bILLING) 
     { 
      throw new NotImplementedException(); 
     } 

내가 뭘 잘못하고 있니?

+0

모두가 다른 경우 'Editor_Id'가 왜 하나의 클래스를 사용하고 Editor_Id를 매개 변수로 전용 생성자에 전달하지 않는가? 그러면 보험 기사 작성자를 기다리십시오. (...) 또는 InsuranceEditor.CreateSecondary (...)를 기다려주십시오. –

+0

@ScottChamberlain 그 질문을 한 후에 나에게 일어난 일입니다. 그러나 더 어려운 다른 경우를 볼 수 있습니다. 따라서 자식 클래스에 정적 Create를 사용하여 상속을 사용할 수있는 방법에 대한 아이디어가 필요합니다. –

+2

나는이 질문에 당신의 질문이 무엇인지 잘 모르겠습니다. 당신은 "할 수 있습니까?"라고 묻습니다.하지만 당신의 질문에 실제 사례가있는 것처럼 보입니다. 당신의 질문은 정확히 무엇입니까? –

답변

2

여전히 안정적으로 문제를 재현하는 좋은 Minimal, Complete, and Verifiable code example을 제공하지 않았습니다. 그러나 예제 프로그램 문과 인용 한 오류 메시지를 기반으로하면 속성 이름과 모호한 문맥에서 PrimaryInsurance 식별자를 사용하려고 시도하는 것 같습니다.

속성의 이름을 유지하려면 유형 이름을 사용하려는 곳이면 어디든 지정할 수 있습니다.예 :

PrimaryInsurance = await MyNamespace.PrimaryInsurance.Create(Patient, BILLING); 

여기에서 MyNamespace은 유형에 대한 실제 네임 스페이스와 동일합니다.

네임 스페이스가 특히 길거나 다른 이유로 인해 매번 전체를 입력하지 않으려는 경우 using 지시문을 사용하여 형식 이름의 별칭을 지정할 수 있습니다. 예를 들어 :

using PrimaryInsuranceType = MyNamespace.PrimaryInsurance; 

그런 다음 프로그램 문은 다음과 같을 수 있습니다 :

물론
PrimaryInsurance = await PrimaryInsuranceType.Create(Patient, BILLING); 

, PrimaryInsuranceType은 예입니다. 속성 이름 자체 (또는 클래스의 다른 속성 이름)와 다른 경우 원하는 별칭 이름을 사용할 수 있습니다.

+0

감사합니다. 그랬어. –

+0

나는 지금까지 약 100 번 "최소, 완전, 그리고 ...."를 읽었습니다. 나는 분명히 그것을 얻지 못하고있다 (나는이 질문에 대해 그렇게 생각했다). "최소 ...."의 좋은 예가 가장 도움이 될 것입니다. –

+1

@Alan : [mcve] 및 [ask] 페이지보다 더 잘 설명하는 방법을 모르겠습니다. 귀하의 질문이 바를 어떻게 충족시키지 못했는지 알려 드릴 수 있습니다. 게시 한 코드를 복사/붙여 넣기만으로는 불가능하며, 변경하지 않고보고 한 문제를 재현하기 위해 코드를 컴파일하려고 시도합니다. [ask] 페이지 끝의 링크에서 기사를 읽었는지 확인하십시오.http://sscce.org/을 읽는 보너스 포인트 (질문을 할 때 좋은 코드 예제를 제공해야한다는 비판적 중요성을 이해하는 데 도움이되는 또 다른 리소스). –

관련 문제