0

我有一个名为 ModelDonation.cs 的 .cs 文件,它包含 3 个类。一个是我希望其他类继承的基类。然后我有两个从基类继承的类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GiftAidCalculator.TestConsole
{

     abstract class Donation
    {
        private decimal DonationAmountTotal;
        public virtual decimal donationAmountTotal
        {
            get
            {
                return donationAmountTotal = DonationAmountTotal;
            }
            set
            {
                DonationAmountTotal = donationAmountTotal;
            }
        }
        private decimal VAT;
        public virtual decimal vAT
        {
            get
            {
                return vAT = VAT;
            }
        }      
    }

     class Donor : Donation
     {
         public override decimal vAT
         {
             get
             {
                 return vAT = VAT;
             }
         }
     }

     class SiteAdministrator : Donation
     {
         public decimal vAT
         {
             get
             {
                 return vAT = VAT;
             }
             set
             {
                 VAT = vAT;
             }
         }
     } 
}

我不希望我的捐助者类能够设置增值税。捐赠者可以获得增值税以查看捐赠的构成。

我希望 SiteAdministrator 能够设置和获取增值税。他是会改变增值税率的人。

我的问题在于在 C# 中使用继承。我不确定如何按照我想要的方式实现它。

任何人都可以帮忙吗?

谢谢!

4

3 回答 3

2

您的问题在于使用继承来解决通过使用接口和组合最好解决的问题。

定义两个接口:

public interface IVatControllable
{
    decimal Vat { get; set; }
}

public interface IVatGettable
{
    decimal Vat { get; }
}

并让您的类实现正确的接口:

public class Donor : IVatGettable
{
    public decimal Vat { get { ... } }
}

等等

在这种情况下,不需要通过继承使您的设计复杂化。

于 2013-11-07T11:44:47.247 回答
1

使propertyb 只获取,并简单地将一种方法添加到新接口。

例子:

/* This isnterface holds method that suitable 
 * for administration related tasks
**/
public interface IAdministrator {
   void SetVAT(..);
  ...
  //other Administration related methods
}

/* Generic, abstract class for Donation description and management*/
abstract class Donation {
   public virtual decimal vAT
   {
        get
        {
            return vAT = VAT;
        }
    }      
}

/*Administrator is able act as Donation AND as Administrator*/
public class Administrator : IAdministrator, Donation
{
}

所以在你的代码中也要表现出责任的逻辑分离。AdministratorDonator,但Administrator也是。

于 2013-11-07T11:46:48.373 回答
0

如果您希望将增值税获取/设置属性保持在一起,您可以定义两个接口:

public interface IVATFullAccess {
    public decimal VAT { get; set; }
};
public interface IVATReader {
    public decimal VAT { get; }
};

public class Administrator: IVATFullAccess,... { ... } // has full access to VAT
public class Donation : IVATReader,...  { ... } // has read-only access to VAT

您可以扩展此技术以包含额外的访问控制——C# 允许一个类从多个接口继承(类似于 C++ 多重继承)。

public class Administrator: IVATFullAccess, IAccountCreate, IEmailNotify, ... {}
public class Donation : IVATReader, IAccountIndex {}

如果您来自像 C++ 这样的语言,请将接口视为虚拟基类。

于 2013-11-07T12:14:33.900 回答