【问题标题】:Create object that inherit the interface [duplicate]创建继承接口的对象[重复]
【发布时间】:2021-05-19 03:04:22
【问题描述】:

我有两个模型接口ILoanModelIAmortizationModel

public interface ILoanModel
{
    string ID { get; set; }
    IEmployeeModel Borrower { get; set; }
    // ******* other propeties *********
    ICollection<Model.IAmortizationModel> AmortizationTable { get; set; }
}

public interface IAmortizationModel
{
    string ID { get; set; }
    ILoanModel Loan { get; set; }
    // ******* other propeties *********
}

我创建另一个接口来处理计算和其他功能

public interface IAmortization
{
    // Compute and generate amortization table
    Model.ILoanModel Generate(Model.ILoanModel loan);
    // **** Other function *****
}

目前我有3种贷款,它们都有相同的计算和摊销表的生成方式。

public abstract class Amortization : Controller.Computation.Interface.IAmortization
{
    public virtual Model.ILoanModel Generate(Model.ILoanModel loan)
    {
        // **** other code *******
        //Create the amortization table
        decimal last_Amortization_RunningBalance = loan.Amount;
        loan.AmortizationTable = new List<Model.IAmortizationModel>();

        for (int x = 1; loan.NumberOfPayment >= x; x++)
        {
            // having problem here because Model.IAmortizationModel is a interface
            var newAmortizationRow = new Model.IAmortizationModel
            {
                ID = Guid.NewGuid().ToString(),
                AmortizationAmount = loan.AmortizationPaymentAmount,
                AmortizationInterest = loan.AmortizationPaymentAmount* loan.Nominal,
                AmortizationPrepayment = 
                    loan.AmortizationPaymentAmount 
                    - (loan.AmortizationPaymentAmount * loan.Nominal),
                AmortizationOutstandingBalance = 
                    last_Amortization_RunningBalance 
                    - (loan.AmortizationPaymentAmount 
                        - (loan.AmortizationPaymentAmount * loan.Nominal)),
                Sequence = x
            };

            last_Amortization_RunningBalance -= 
                newAmortizationRow.AmortizationOutstandingBalance;
            loan.AmortizationTable.Add(newAmortizationRow);
        }
    }
}

我现在的问题是生成新的IAmortizationModel,它将被添加到loan.AmortizationTable。如何获取loan.AmortizationTable的类型并创建?

【问题讨论】:

  • 你为什么使用接口?您是否有多种贷款模型和摊销模型的实现?如果你这样做了,并且你确实需要实例化一个对象,你可以使该方法成为通用方法并为其添加 new() 约束。
  • @IanMercer 是的,对汽车贷款和紧急贷款进行抽样。汽车贷款有字段需要指定汽车品牌和型号,而紧急贷款需要紧急情况。
  • 恕我直言,添加一个protected abstract IAmortizationModel Factory(...) 方法。

标签: c# oop abstract-class


【解决方案1】:

一种选择是使其通用并使用new() 添加通用约束:

public virtual Model.ILoanModel Generate<T>(Model.ILoanModel loan)
   where T:IAmortizationModel, new()

然后拨打new T()

另一种选择是传递生成器函数:

public virtual Model.ILoanModel Generate(Model.ILoanModel loan,
  Func<IAmortizationModel> generator)

并致电generator()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 2014-12-24
    • 2013-05-14
    • 2018-04-05
    • 2013-08-31
    • 2021-12-11
    • 2019-05-08
    • 2015-02-01
    相关资源
    最近更新 更多