C#我希望一个继承类只设置,另一个继承类只获取

C#我希望一个继承类只设置,另一个继承类只获取,c#,inheritance,get,set,C#,Inheritance,Get,Set,我有一个名为modeldovation.cs的.cs文件,它包含3个类。一个是我的基类,我希望我的其他类从中继承。然后我有两个从基类继承的类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace GiftAidCalculator.TestConsole { abstract class Donation { privat

我有一个名为modeldovation.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;
             }
         }
     } 
}
我不希望我的捐赠者类能够设置增值税。捐赠者可以拿到增值税,看看捐赠是由什么组成的

我希望站点管理员能够设置和获取增值税。他就是那个会改变增值税税率的人

我的问题在于在C#中使用继承。我不知道如何以我想要的方式实施它

有人能帮忙吗


谢谢

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

定义两个接口:

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

public interface IVatGettable
{
    decimal Vat { get; }
}
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
并让您的类实现正确的接口:

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


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

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

定义两个接口:

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

public interface IVatGettable
{
    decimal Vat { get; }
}
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
并让您的类实现正确的接口:

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


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

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

定义两个接口:

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

public interface IVatGettable
{
    decimal Vat { get; }
}
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
并让您的类实现正确的接口:

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


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

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

定义两个接口:

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

public interface IVatGettable
{
    decimal Vat { get; }
}
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
并让您的类实现正确的接口:

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


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

只让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
也是。

使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
也是。

使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
也是。

使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

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

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

public interface IVatGettable
{
    decimal Vat { get; }
}
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++多重继承)。

如果你来自C++语言,把界面看作一个虚拟基类。

< P>如果你喜欢把增值税获取/设置属性放在一起,你可以定义两个接口:

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;
             }
         }
     } 
}
public interface IVatControllable
{
    decimal Vat { get; set; }
}

public interface IVatGettable
{
    decimal Vat { get; }
}
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++多重继承)。

如果你来自C++语言,把界面看作一个虚拟基类。

< P>如果你喜欢把增值税获取/设置属性放在一起,你可以定义两个接口:

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;
             }
         }
     } 
}
public interface IVatControllable
{
    decimal Vat { get; set; }
}

public interface IVatGettable
{
    decimal Vat { get; }
}
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++多重继承)。

如果你来自C++语言,把界面看作一个虚拟基类。

< P>如果你喜欢把增值税获取/设置属性放在一起,你可以定义两个接口:

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;
             }
         }
     } 
}
public interface IVatControllable
{
    decimal Vat { get; set; }
}

public interface IVatGettable
{
    decimal Vat { get; }
}
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++多重继承)。

如果你来自C++之类的语言,把界面看作是虚拟基类。

我不确定你是用正确的方式来绕过模型。代码>捐赠者和
站点管理员
听起来像是用户角色,永远不会从
捐赠
继承。我不确定您是否以正确的方式进行建模<代码>捐赠者和
站点管理员
听起来像是用户角色,永远不会从
捐赠
继承。我不确定您是否以正确的方式进行建模<代码>捐赠者和
站点管理员
听起来像是用户角色,永远不会从
捐赠
继承。我不确定您是否以正确的方式进行建模<代码>捐赠者和
站点管理员
听起来像是用户角色,永远不会从
捐赠
中继承。谢谢你这么做。我需要更多地利用OOP,并且使用接口能达到我想要的效果。@nickgowdy很高兴能提供帮助。谢谢你的帮助。我需要更多地利用OOP,并且使用接口能达到我想要的效果。@nickgowdy很高兴能提供帮助。谢谢你的帮助。我需要更多地利用OOP,并且使用接口能达到我想要的效果。@nickgowdy很高兴能提供帮助。谢谢你的帮助。我需要更多地利用OOP,并且使用接口能达到我想要的效果。@nickgowdy很高兴能提供帮助。
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;
             }
         }
     } 
}