首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中使用继承在子类中应用不同折扣的问题

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

Stack Overflow用户
提问于 2018-05-21 15:53:50
回答 2查看 303关注 0票数 1

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

欠款方法使用折扣变量来确定欠款数额。如何允许有价值的客户使用自己的折扣变量?

代码语言:javascript
复制
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());
        }
    }
}

预期示例输出:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-21 16:00:33

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

关于基类Customer

代码语言:javascript
复制
    public class Customer
    {
        protected virtual float Discount => 0;
        ...
    }

关于有价值的客户子类:

代码语言:javascript
复制
    public class ValuedCustomer : Customer
    {
        protected override float Discount => 0.1f;
        ...
    }

现在,在Owes()方法中,

代码语言:javascript
复制
  return Math.Abs(balance * Discount - balance);    

将检索适合实际类实例类型的多态Discount

(注:我已经按照.Net规范更新了变量名称)

票数 4
EN

Stack Overflow用户

发布于 2018-05-21 15:56:47

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

代码语言:javascript
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50452465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档