我有两个类,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
答案 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规范更新了变量名称)