【问题标题】:OOP Design in C# subclass method with more parameters具有更多参数的 C# 子类方法中的 OOP 设计
【发布时间】:2015-09-19 17:01:16
【问题描述】:

假设我有这两个类:

public class Threshold {
    int min;
    int max;

    public virtual int calculate(int min, int max)
    {
        //calculate basic Threshold        
    }        
}


public class AdvancedThreshold : Threshold {
    int min;
    int max;
    int extra;

    public override int calculate(int min, int max, int extra)
    {
        //calculate Advanced Threshold        
    }
}

我不能这样做,因为基方法有两个参数,而子类方法有三个参数。

解决这个问题的最佳设计实践是什么?是否可以使用多态对象?我需要使用复合对象而不是继承吗?

我在这里https://stackoverflow.com/a/56904/3032175读到了与我的问题类似的内容

但我并不真正了解解决方案。谢谢你。

【问题讨论】:

  • 我不明白这个问题; AdvancedThreshold 对象的方法必须 用两个参数调用的问题是什么?继承不能很好地处理向子类添加限制;子类应该添加新功能,而不是新限制。也许你的阶级关系倒退了?
  • 我正在努力解决这个问题stackoverflow.com/a/56904/3032175board 和threeDboard

标签: c# oop design-patterns liskov-substitution-principle


【解决方案1】:

不完全确定您想要实现什么,但您可能需要重新考虑设计。 min/max/extra 的值似乎不应该传递给 Calculate 方法,而是设置为属性或传递给构造函数。

public class Threshold
{
    public int Min { get; set; }
    public int Max { get; set; }

    public virtual int Calculate( int input )
    {
        // logic goes here
    }
}

public class AdvancedThreshold : Threshold
{
    public int Extra { get; set; }

    public override int Calculate( int input )
    {
        // advanced logic goes here
    }
}

【讨论】:

  • 是的,这就是我的想法。也许是一个没有任何参数的计算方法并将参数传递给构造函数。我想用最好的设计方法解决这个问题stackoverflow.com/a/56904/3032175
  • @user3032175 是的,board/3d board 问题肯定不像这个那么简单。
【解决方案2】:

当您从一个类继承时,您无法更改为方法提供实现所需的方法。但是您可以添加新方法。

有几种方法可以实现你想要的

你为方法提供了两个重载

public virtual int calculate(int min, int max){}

public virtual int calculate(int min, int max,int extra){}

或者你可以根据另一个实现一个

public override int calculate(int min, int max)
{
   calculate(min,max,extra)
}

public  int calculate(int min, int max, int extra){}

【讨论】:

  • 是的,我明白这一点。我想问的是这个问题的最佳解决方案是什么?我不能使用继承。即使我通过编写新方法来使用它,我也违反了 LISKOV 原则。那么最好的解决方案是什么?
  • 谢谢。这个帖子怎么样stackoverflow.com/questions/56860/…也许我们应该找到另一种方法。 ThreeDBoard 应该由 Board 对象组成,而不是扩展 Board。 Z 轴每单位一个 Board 对象。我真的不明白他指的是什么
猜你喜欢
  • 2012-02-25
  • 2015-10-08
  • 2020-10-06
  • 1970-01-01
  • 2014-09-16
  • 2011-09-08
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多