目标: 我的代码的目标基本上是将商品添加到购物车中。当我尝试添加项目时,项目的类型与方法/函数链接在一起。
虽然过程: 我的想法是,由于 Dairy 和 Meat 具有共同的功能,例如 WithDescription(string a) 和 WithUnitPrice(decimal a) 我创建了一个共同的类,(Dairy 和 Meat)都继承自称为 Item 并且它具有这两个功能。 Item 类继承自一个名为 IGrocery 的接口类,它具有这两个功能。问题是这两个函数都需要返回一个泛型或通用类型,所以我可以进行方法/函数链接。
问题: 我如何实现这些类,以便我可以对项目(乳制品和肉类类型的项目)进行方法/函数链接?
这段代码在我的主要功能中: 当我将 Dairy 类型的商品添加到购物车并在最后调用 WithQuantity(2) 时,我收到了一个错误。我不允许操纵主要功能。
Cart groceryCart = new Cart() { TypeOfCart = TypeOfCart.Grocery };
groceryCart.AddItem(new Dairy().WithDescription("Gallon of Milk").WithUnitPrice(3.50m).WithQuantity(2));
groceryCart.AddItem(new Meat().WithWeight(3.5m).WithDescription("Hamburger").WithUnitPrice(2.96m));
IGrocery.cs:
using System;
namespace Sample1.Models.Cart.Grocery
{
public interface IGrocery<T>
{
T WithDescription(string description);
T WithUnitPrice(decimal unitPrice);
}
}
Item.cs:
using System;
namespace Sample1.Models.Cart.Grocery
{
public class Item: IGrocery<Item>
{
string description { get; set; }
decimal unitPrice { get; set; }
public Item WithDescription(string description)
{
this.description = description;
return this;
}
public Item WithUnitPrice(decimal unitPrice)
{
this.unitPrice = unitPrice;
return this;
}
}
}
Dairy.cs:
using System;
namespace Sample1.Models.Cart.Grocery
{
public class Dairy: Item
{
int quantity { get; set; }
public Dairy WithQuantity(int quantity)
{
this.quantity = quantity;
return this;
}
}
}
Meat.cs:
using System;
namespace Sample1.Models.Cart.Grocery
{
public class Meat: Item
{
decimal weight { get; set; }
public Meat()
{
}
public Meat WithWeight(decimal weight)
{
this.weight = weight;
return this;
}
}
}
Cart.cs: 这个 Cart 类还没有完成,但我现在已经部分实现了它。
using System;
using System.Collections.Generic;
using Sample1.Models.Cart.Grocery;
namespace Sample1.Models.Cart
{
//Add more types of Carts if necessary
public enum TypeOfCart
{
Grocery,
}
public class Cart: ICart
{
public TypeOfCart TypeOfCart { get; set; }
public int numberOfItems { get; set; }
LinkedList<object> listOfItems { get; set; }
public Cart()
{
}
public Cart(TypeOfCart typeOfCart)
{
this.TypeOfCart = typeOfCart;
}
public void AddItem(object item)
{
}
public void Contents()
{
throw new NotImplementedException();
}
public decimal TotalPrice()
{
throw new NotImplementedException();
}
}
}
我继续使用 google 和 stackoverflow 并试图找到与多级继承和函数/方法链接相关的任何内容,但没有一个在 C# 中被引用或接近我的情况。
您的
Item
类将从 Item
方法返回一个 IGrocery<T>
对象。这就是为什么 WithQuantity()
不起作用的原因,您的 Item
根本不知道这个方法是什么。相反,您可以尝试像这样实现您的IGrocery<T>
:
public class Item<T> : IGrocery<T> where T : Item<T>
{
string description { get; set; }
decimal unitPrice { get; set; }
public T WithDescription(string description)
{
this.description = description;
return (T)this;
}
public T WithUnitPrice(decimal unitPrice)
{
this.unitPrice = unitPrice;
return (T)this;
}
}
像这样使用它:
public class Dairy : Item<Dairy>
{
int quantity { get; set; }
public Dairy WithQuantity(int quantity)
{
this.quantity = quantity;
return this;
}
}
现在对于
Dairy
类Item<T>.WithDescription()
和Item<T>.WithUnitPrice()
将返回Dairy
对象而不是Item
对象。
而且,如果您需要更改 AddItem
(或任何类似的东西)以仅使用 Item<T>
以及从它继承的任何内容,您可以这样做:
public void AddItem<T>(T item) where T : Item<T>