如何为基于超类值进行验证的值对象创建基类/结构?

这是一个问题,我不确定如何称呼它或如何命名我想做的事情,但希望代码示例能够说明一切。我有 PHP 背景,正在学习 .NET Core 2.2/3.0。我现在遇到的问题是如何在创建类似的类时避免一些代码重复。例如,我想创建基本上只包含字符串的多个值对象,但每个值对象都有不同的约束。然而,在大多数情况下,唯一的限制差异在于长度。


所以在 PHP 中我会做这样的事情:


abstract class Text

{

    abstract public static function maxCharacters(): int;


    protected $value;


    public function __construct(string $text)

    {

        if (mb_strlen($text) > static::maxCharacters()) {

            throw new LengthException(sprintf('Too many characters, the max is %d.', static::maxCharacters()));

        }


        $this->value = $text;

    }


    public function value(): string

    {

        return $this->value;

    }

}


class Name extends Text

{

    public static function maxCharacters(): int

    {

        return 50;

    }

}


class Description extends Text

{

    public static function maxCharacters(): int

    {

        return 1000;

    }

}


这不是继承的最佳示例,但目标是说明这一点,即我希望有 1 个地方可以放置验证逻辑,然后在子类中只需定义验证的参数,而不是定义验证的参数。执行验证的实际逻辑。

但正如您所看到的,如果没有继承,就会进行大量的复制/粘贴,而复制/粘贴是我更愿意避免的事情。我能想到的唯一选择是创建一个单独的TextValidator类或我可以从中调用的东西set,我只需要传递最大数量的字符,但这仍然会给我留下比我更多的复制/粘贴更喜欢。

您如何在 C# 中以尽可能少的复制/粘贴来编写这样的内容?


ITMISS
浏览 120回答 1
1回答

烙印99

看来您已经在 PHP 示例中了解了继承的基础知识;我只是建议阅读一些C# 语法。就其价值而言,以下方法可以解决问题:public abstract class Text{    public string Value { get; }    public Text(string val) {        if (val.Length > MAX) throw new Exception();        Value = val;    }    protected abstract int MAX{get;}}public class Name : Text{    public Name(string val): base(val) { }    protected override int MAX => 50;}public class Description : Text{    public Description(string val) : base(val) { }    protected override int MAX => 1000;}我还将添加一个脚注,说明从类构造函数调用抽象方法/属性时要小心(这就是我在这里所做的)。例如,如果 MAX 的值是一个计算值,该值取决于已初始化的对象,则可能会遇到一些问题。但在这种情况下,这不会成为问题。
打开App,查看更多内容
随时随地看视频慕课网APP