在C#中使用继承在子类中应用不同折扣的问题

时间:2018-05-21 15:53:50

标签: c#

我有两个类,Customer是基类,ValuedCustomer是继承自基类的类。 Customer类的折扣为0%(类变量),ValuedCustomer(类变量)的折扣为10%。

owes方法使用discount变量来确定欠款。如何让Valued客户使用自己的折扣变量?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Customer
{
    public class Customer
    {
        private float discount = 0; //CV
        public string name;
        public float balance;
        public string addr1;
        public string addr2;
        public string addr3;

        public Customer(string name, float balance, string addr1, string addr2, string addr3)
        {
            this.name = name;
            this.balance = balance;
            this.addr1 = addr1;
            this.addr2 = addr2;
            this.addr3 = addr3;
        }

        public virtual float owes()
        {
            return Math.Abs(balance * discount - balance);
        }

        public override string ToString()
        {
            return String.Format("{0}\n{1:0.00}\n{2}\n{3}\nBalance: {4}\nDiscount: {5}%\nAmount due: {6:0.00}", name,addr1,addr2,addr3,balance,discount*100, owes());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Customer c1 = new Customer("Jimmy", 100, "22 Main Street", "Naas", "Kildare");
            ValuedCustomer c2 = new ValuedCustomer("Lucy", 100, "23 Main Street", "Roosky", "Roscommon");
            Customer c3 = new Customer("Fred", 200, "24 Main Street", "Sneem", "Kerry");

            Console.WriteLine(c1);
            Console.WriteLine(c2);
            Console.WriteLine(c3);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Customer
{
    public class ValuedCustomer : Customer
    {
        private float discount = 0.1f;

        public ValuedCustomer(string name, float balance, string addr1, string addr2, string addr3) : base(name,balance,addr1,addr2,addr3)
        {
        }

        public override string ToString()
        {
            return String.Format("{0}\n{1:0.00}\n{2}\n{3}\nBalance: {4}\nDiscount: {5}%\nAmount due: {6:0.00}", name, addr1, addr2, addr3, balance, discount * 100, owes());
        }
    }
}

预期示例输出:

Jimmy
22 Main Street
Naas
Kildare
Balance: 100
Discount: 0%
Amount due: 100.00
Lucy
23 Main Street
Roosky
Roscommon
Balance: 100
Discount: 10%
Amount due: 90.00
Fred
24 Main Street
Sneem
Kerry
Balance: 200
Discount: 0%
Amount due: 200.00

2 个答案:

答案 0 :(得分:4)

在这种情况下,您不需要两个不同的类,它们都具有相同的属性但值不同,在构造函数中传递折扣或添加布尔值来决定要应用的折扣:

public Customer(string name, float balance, string addr1, string addr2, string addr3, float discount)
{
    this.name = name;
    this.balance = balance;
    this.addr1 = addr1;
    this.addr2 = addr2;
    this.addr3 = addr3;
    this.discount = discount;
} 

class Program
{
    static void Main(string[] args)
    {
        Customer c1 = new Customer("Jimmy", 100, "22 Main Street", "Naas", "Kildare", 0);
        Customer c2 = new Customer ("Lucy", 100, "23 Main Street", "Roosky", "Roscommon", 10);
        Customer c3 = new Customer("Fred", 200, "24 Main Street", "Sneem", "Kerry", 0);

        Console.WriteLine(c1);
        Console.WriteLine(c2);
        Console.WriteLine(c3);
    }
}

答案 1 :(得分:4)

在您的类层次结构中,Discount应该是可覆盖的:

在基类Customer

    public class Customer
    {
        protected virtual float Discount => 0;
        ...
    }

在有价值的客户子类上:

    public class ValuedCustomer : Customer
    {
        protected override float Discount => 0.1f;
        ...
    }

现在,在Owes()方法中,

  return Math.Abs(balance * Discount - balance);    

将检索多态Discount,与实际的类实例类型相适应。

(注意我已根据.Net规范更新了变量名称)