如何在 C# 中使用多级继承进行方法/函数链接?

问题描述 投票:0回答:1

目标: 我的代码的目标基本上是将商品添加到购物车中。当我尝试添加项目时,项目的类型与方法/函数链接在一起。

虽然过程: 我的想法是,由于 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# 中被引用或接近我的情况。

c# class oop inheritance method-chaining
1个回答
0
投票

您的

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>
© www.soinside.com 2019 - 2024. All rights reserved.