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

本文关键字:静态 构造函数 创建 子类 抽象类 | 更新日期: 2023-09-27 17:53:47

我对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(异步OOP构造函数)的工厂模式

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继承似乎是自然的。现在的问题是如何"正确"地对Primary和Secondary Insurance应用async/await。我希望用法是这样的:

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

这能做到吗?

编辑# 1。在发布这个问题之后,我认为它可能已经被问到,静态方法继承的正确替代方案是什么?我想要的东西在c#中是做不到的。这是正确的吗?

编辑#2:我在VS中遇到的问题来自于使用声明:

PrimaryInsurance = await PrimaryInsurance。创建(病人、计费);

VS告诉我:

InsuranceEditor成员"。创建(PatientDemographicsEditor、计费)不能用实例引用访问;用一个类型限定它的名字而不是

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

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

我做错了什么?

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

您仍然没有提供一个良好的最小化、完整和可验证的代码示例来可靠地再现问题。但是根据示例程序语句和您引用的错误消息,似乎您正在尝试在与属性名称不明确的上下文中使用PrimaryInsurance标识符。

如果想要保留属性的名称,那么在任何想要使用类型名称的地方,都需要完全限定它。例如:

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

其中MyNamespace是该类型的实际名称空间。

如果名称空间特别长,或者出于任何其他原因,您不希望每次都输入整个内容,您可以使用using指令别名类型名称。例如:

using PrimaryInsuranceType = MyNamespace.PrimaryInsurance;

那么你的程序语句可能像这样:

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

当然,PrimaryInsuranceType只是一个例子。您可以使用任何类型别名,只要它不同于属性名称本身(或类中的任何其他属性名称)。