c# – 怀疑如何组织我的课程

这只是我代码中的一个例子.我正在寻找一种很好的方法来按顺序维护我的课程并遵循一些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);
}

下面是一个派生自Problem的类,Arithetic类包含数学问题中包含的所有必要内容,以及如何解决它:

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

然后我有一个生成算术问题的类,它接收一个元组,其中包含一些指示条件的属性

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> 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");
        }
    }
}

事情是……我需要有更多属性,比如Result(在算术类中只需要1,比较2个数字,我们需要两个属性结果),问题编号,时间(秒)来解决问题.

问题是,我不知道应该把这些属性放在哪里.有一种方法是在Problem类中添加其中的一些,或者创建另类这样的类:

ArithmeticProblem

>问题问题< - 这是算术类
>结果
>时间
>问题编号

我只想按要求组织我的课程.
提前致谢.

解决方法

您可以为结果提供不同的类,在算术类中接受结果类型为通用:

public class Arithmetic < TResult> : ...

和加法可以如下:

public class Addition : Arithmetic <decimal>
...

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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...