可以为抽象类的子项创建静态构造函数吗?

时间:2016-07-01 18:14:38

标签: c# oop asynchronous

我是async / await的新手,并且已经"改进"我两年前写的一个完全同步的应用程序。我有以下情况,我对我的解决方案不满意。

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继承自抽象类Insurance:

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似乎很自然。问题现在伴随着#34;正确&#34;将async / await应用于主要和次要保险。我希望用法类似于:

PrimaryInsurance = await PrimaryInsurance.Create(....)其中Create(...)被视为PrimaryInsurance的静态方法(不一定是抽象类InsuranceEditor的静态方法。)

可以这样做吗?

编辑#1。在发布此问题后,我认为可能已经问过What's the correct alternative to static method inheritance?并且我想要的东西不能在C#中完成。这是对的吗?

编辑#2:我在VS中遇到的问题带有使用声明:

  

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

VS告诉我:

  

会员&#39; InsuranceEditor.Create(PatientDemographicsEditor,Billing)&#39;   无法使用实例引用访问;用类型限定它   改为命名

然后,如果我允许VS创建Create(...)(这样就没有错误),那么它就会在抽象的InsuranceEditor类中生成,而不是在PrimaryInsurance类中。

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

我做错了什么?

1 个答案:

答案 0 :(得分: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只是一个例子。您可以使用所需的任何类型别名,只要它与属性名称本身(或类中的任何其他属性名称)不同。