我有一个名为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#中的继承。我不知道如何以我想要的方式实现它。
有人可以帮忙吗?
谢谢!
答案 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
{
}
因此,代码中的可重新定位的逻辑分离也很明显。 Administrator
为Donator
,但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 ++之类的语言,请将接口视为虚拟基类。