c# - C# 中返回类型多于 1 的函数是否可行?

标签 c# function types return

我知道函数本身不能有超过 1 个返回类型。我正在寻找替代品。

场景

我有一个类Product其中我有各种属性。 我有一个类Discounts ,其中我有很多其他类(不同类型的折扣)

折扣,无论类型如何,都是对象 - 因为它们都有一个 Type (百分比/固定)和 Value (小数形式的价格)等。每个折扣也分配了一个产品,以便系统知道要在哪个产品上应用此折扣规则。

三种折扣类型:

BasicDiscount AdvancedDiscount SuperDiscount

我有一个 List<T>对于每个不同的折扣,以便按类型分组。

我的目标是拥有一个接受 Product 的函数作为参数,循环遍历折扣列表中的每个折扣以检查产品是否存在。如果找到对象,我希望函数返回该对象,无论它是 BasicDiscount , AdvancedDiscount , SuperDiscount等等(列出的折扣类型将出现在我的折扣类中)

这是我目前所处位置的示例。

假设 Product X有一个 BasicDiscount应用于它。

function object getDiscount(Product p){

    (UnknownType) discount;

     foreach (BasicDiscount b in BasicDiscounts)
                    if (b.Product.ID == p.ID)
                       discount = b;
     foreach (AdvancedDiscount ad in AdvancedDiscounts)
                    if (ad.Product.ID == p.ID)
                       discount = ad;
     foreach (SuperDiscount sd in SuperDiscounts)
                    if (sd.Product.ID == p.ID)
                       discount = sd;

     return discount;

由于我不知道产品可能存在哪种类型的折扣,我怎样才能返回正确的折扣?

或者有别的办法吗?

TLDR; - 如果您必须创建一个必须返回姓名或年龄的函数(使用 int 或 string 作为它们的数据类型),但您不知道将选择哪一个 - 您的函数将返回什么类型是吗?

非常感谢帮助,谢谢! :)

最佳答案

接口(interface)!

您可以使用每个折扣类实现的接口(interface),然后只需将接口(interface)返回给调用方法即可。

例如。

public interface IDiscount
{
    // method or property signatures
}

public class BasicDiscount : IDiscount
{
    // implementation of interface members
}

public IDiscount getDiscount(Product p)
{
     (IDiscount) discount;

     foreach (BasicDiscount b in BasicDiscounts)
         if (b.Product.ID == p.ID)
             discount = b;
     foreach (AdvancedDiscount ad in AdvancedDiscounts)
         if (ad.Product.ID == p.ID)
             discount = ad;
     foreach (SuperDiscount sd in SuperDiscounts)
         if (sd.Product.ID == p.ID)
             discount = sd;

     return discount;
}

关于c# - C# 中返回类型多于 1 的函数是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949355/

相关文章:

node.js - Sequelize 数据类型未经过验证

scala - 为所有 Traversable 丰富我的图书馆

c# - WPF - 设置 IsOpen=true 时工具提示数据绑定(bind)不起作用

java - Java 8 中 '()->{}' 的类型是什么?

c# - 在 Visual Studio 中测试单独成功,在一组中失败

c - 如何用write在C中输出单个字符?

javascript - 函数运行过程中出现奇怪的错误

验证用户输入的 Pythonic 方式

c# - 我可以在 C# 的抽象类中省略接口(interface)方法吗?

c# - 帮助将 sql 查询转换为 LINQ