C# 我不知道如何组织我的课程

C# 我不知道如何组织我的课程,c#,oop,C#,Oop,这里只是我代码中的一个示例。我正在寻找一种很好的方法来维护我的类,并遵循一些OOP规则 这是我的抽象类问题: public abstract class Problem<T> : IEquatable<T> { public abstract int ResultCount { get; } protected abstract bool CheckTheAnswer(params object[] results); public abstrac

这里只是我代码中的一个示例。我正在寻找一种很好的方法来维护我的类,并遵循一些OOP规则

这是我的抽象类问题:

public abstract class Problem<T> : IEquatable<T>
{
    public abstract int ResultCount { get; }
    protected abstract bool CheckTheAnswer(params object[] results);
    public abstract bool Equals(T other);
}
公共抽象类问题:IEquatable
{
公共抽象int ResultCount{get;}
受保护的抽象布尔检查答案(参数对象[]结果);
公共抽象布尔等于(T其他);
}
下面是一个从问题派生的类,算术类包含数学问题中包含的所有必要内容,以及如何解决它:

public enum Operations
{
    Addition, Subtraction, Multiplication, Division
}

public class Arithmetic : Problem<Arithmetic>
{
    public decimal Number1
    {
        get;
        set;
    }

    public Operations Operation
    {
        get;
        set;
    }

    public decimal Number2
    {
        get;
        set;
    }

    public override int ResultCount
    {
        get { return 1; }
    }

    protected override bool CheckTheAnswer(params object[] results)
    {
        if (results.Length != ResultCount)
            throw new ArgumentException("Only expected " + ResultCount + " arguments.");

        decimal result = (decimal)results[0];

        switch (Operation)
        {
            case Operations.Addition:
                return Number1 + Number2 == result;
            case Operations.Subtraction:
                return Number1 - Number2 == result;
            case Operations.Multiplication:
                return Number1 * Number2 == result;
            case Operations.Division:
                return Number1 / Number2 == result;
            default:
                throw new Exception("Operator unexpected");
        }
    }

    public override bool Equals(Arithmetic other)
    {
        if (other == null)
            return false;

        return this.Number1 == other.Number1 && Number2 == other.Number2;
    }
}

public class Addition : Arithmetic
{
    public Addition(decimal addend1, decimal addend2)
        : base()
    {
        Number1 = addend1;
        Number2 = addend2;
        Operation = Operations.Addition;
    }
}

// Subtraction, Multiplication and Divison here
公共枚举操作
{
加、减、乘、除
}
公共课算术:问题
{
公共十进制数1
{
得到;
设置
}
公共行动
{
得到;
设置
}
公共十进制数2
{
得到;
设置
}
公共覆盖int ResultCount
{
获取{return 1;}
}
受保护的覆盖布尔检查答案(参数对象[]结果)
{
if(results.Length!=ResultCount)
抛出新的ArgumentException(“仅应为”+ResultCount+“参数”);
十进制结果=(十进制)结果[0];
开关(操作)
{
案例操作。补充:
返回Number1+Number2==结果;
案例操作。减法:
返回Number1-Number2==结果;
大小写运算.乘法:
返回Number1*Number2==结果;
案件运作司:
返回Number1/Number2==结果;
违约:
抛出新异常(“运算符意外”);
}
}
公共覆盖布尔等于(算术其他)
{
如果(其他==null)
返回false;
返回this.Number1==other.Number1&&Number2==other.Number2;
}
}
公共类加法:算术
{
公共加法(十进制加法1,十进制加法2)
:base()
{
Number1=加法1;
数字2=加数2;
操作=操作。添加;
}
}
//这里有减法、乘法和除法
然后我有另一个类生成一个算术问题,它接收一个元组,其中包含一些表示条件的属性

interface IProblemFactory<T> where T : Problem<T>
{
    T Create();
}

public class ArithmeticProblemFactory : IProblemFactory<Arithmetic>
{
    private Tuple<Operations, Range, Range> _condition;

    public ArithmeticProblemFactory(Tuple<Operations, Range, Range> condition)
    {
        this._condition = condition;
    }

    public Arithmetic Create()
    {
        Operations operation = _condition.Item1;
        decimal a = _condition.Item2.GetNumber();
        decimal b = _condition.Item3.GetNumber();

        switch (operation)
        {
            case Operations.Addition:
                return new Addition(a, b);
            case Operations.Subtraction:
                return new Subtraction(a, b);
            case Operations.Multiplication:
                return new Multiplication(a, b);
            case Operations.Division:
                return new Division(a, b);
            default:
                throw new Exception("Operator unexpected");
        }
    }
}
接口I问题工厂,其中T:问题
{
T Create();
}
公共类算术问题工厂:IProblemFactory
{
私有元组条件;
公共算术问题工厂(元组条件)
{
这个条件=条件;
}
公共算术创建()
{
操作操作=_condition.Item1;
十进制a=_条件.Item2.GetNumber();
十进制b=_条件.Item3.GetNumber();
开关(操作)
{
案例操作。补充:
返回新添加项(a、b);
案例操作。减法:
返回新的减法(a,b);
大小写运算.乘法:
返回新的乘法(a,b);
案件运作司:
返回新分区(a、b);
违约:
抛出新异常(“运算符意外”);
}
}
}
问题是。。。我需要更多的属性,比如Result(在算术类中只需要1,比较2个数字,我们需要两个属性Result)、problem number、解决问题的时间(秒)

问题是,我不知道应该把这些属性放在哪里。一种方法是在问题类中添加其中一些,或者创建另一个类,如下所示:

算术问题


  • 问题我建议将结果、时间(生成或解决)和问题编号都放在问题类中。每个问题都有自己的结果、时间和数量;它们也可以包括在内。这使您无需将另一个类链接到每个问题,也无需拥有一个包罗万象的问题类。

    您可以为结果创建不同的类,并在算术类中将结果类型接受为泛型:

    public class Arithmetic < TResult> : ...
    

    但是,如果参数的数量(如结果、时间等)不是固定的(动态的),您可以使用字典并将其存储在字典(其类型)中,然后编写特定的操作并将其设置为字典的值。

    我建议先清理您现在拥有的设计,然后继续前进。枚举操作的意义是什么?每种类型的算术运算都有子类,因此不需要枚举。通过将switch分支中的代码移动到算术类中抽象方法的实现中,将这些switch语句重构为类层次结构。此外,如果你想使用等值方法,考虑比较操作的类型。一方面我也这么认为,但是问题中包含了不同的数据类型。其中一些结果是类分数,另一些是小数,等等。你认为有一个答案类方便吗?好吧,如果你想将结果存储为浮点值,你可以添加一个方法将其转换为分数,并且仍然在你的问题类中:)请注意这个问题。。这是同一个问题,但更具体的是@oscar.fimbres,我找不到这两个问题之间的任何区别,请编辑当前的问题。我唯一想让您知道的是,我需要保留不同的数据类型,如answer,问题可能有多个结果(result1和result2)。我在想是否有必要创建另一个类来存储每个数学的所有答案problem@oscar.fimbres,您可以为不同的结果定义一个类,并将它们作为泛型参数传递(我在回答中提到了这一点)。但是您不认为最好专门创建另一个类来存储此问题的答案吗?我的意思是,一节课是为了解决问题,另一节课是为了回答问题(这些课包含了检查…),我说这些是因为后来
    public class Addition : Arithmetic <decimal>
    ...