0

ModelDonation.cs という .cs ファイルがあり、3 つのクラスが含まれています。1 つは、他のクラスに継承させたい基本クラスです。次に、基本クラスから継承する 2 つのクラスがあります。

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;
             }
         }
     } 
}

ドナー クラスが VAT を設定できるようにしたくありません。寄付者は VAT を取得して、寄付の内容を確認できます。

SiteAdministrator が VAT を SET および GET できるようにしたい。彼は VAT 率を変更する人物です。

私の問題は、C# で継承を使用することです。希望どおりに実装する方法がわかりません。

誰でも助けることができますか?

ありがとう!

4

3 に答える 3

2

あなたの問題は、継承を使用して、インターフェイスと構成を使用して解決するのが最適な問題を解決することにあります。

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 を取得専用にし、メソッドを 1 つだけ新しいインターフェイスに追加します。

例:

/* 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ですがDonatorAdministratorあまりにも。

于 2013-11-07T11:46:48.373 に答える