【问题标题】:C# I want one inherited class to SET only and other inherited class to GET onlyC# 我希望一个继承的类只设置,而另一个继承的类只获取
【发布时间】:2013-11-07 11:41:45
【问题描述】:

我有一个名为 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# 中使用继承。我不确定如何按照我想要的方式实现它。

谁能帮忙?

谢谢!

【问题讨论】:

  • 我不确定您是否以正确的方式进行建模。 DonorSiteAdministrator 听起来像是用户角色,并且永远不会从 Donation 继承。

标签: c# inheritance get set


【解决方案1】:

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

定义两个接口:

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

public interface IVatGettable
{
    decimal Vat { get; }
}

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

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

等等

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

【讨论】:

  • 谢谢你的作品。我需要努力更多地利用 OOP,并使用接口达到我想要的效果。
  • @nickgowdy 很高兴能帮上忙。
【解决方案2】:

使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

【讨论】:

    【解决方案3】:

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

    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++ 之类的语言,请将接口视为虚拟基类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多