为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
ITMISS 2023-08-27 10:15:11
这是一个问题,我不确定如何称呼它或如何命名我想做的事情,但希望代码示例能够说明一切。我有 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# 中以尽可能少的复制/粘贴来编写这样的内容?
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

看来您已经在 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 的值是一个计算值,该值取决于已初始化的对象,则可能会遇到一些问题。但在这种情况下,这不会成为问题。



查看完整回答
反对 回复 2023-08-27
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信