C#我希望一个继承的类只能用于SET,而其他继承的类只能用于GET

时间:2013-11-07 11:41:45

标签: c# inheritance get set

我有一个名为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#中的继承。我不知道如何以我想要的方式实现它。

有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

定义两个接口:

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

public interface IVatGettable
{
    decimal Vat { get; }
}

让你的类实现正确的接口:

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

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

答案 1 :(得分: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也是。

答案 2 :(得分: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 ++之类的语言,请将接口视为虚拟基类。