这是一个问题,我不确定如何称呼它或如何命名我想做的事情,但希望代码示例能够说明一切。我有 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 的值是一个计算值,该值取决于已初始化的对象,则可能会遇到一些问题。但在这种情况下,这不会成为问题。
- 1 回答
- 0 关注
- 119 浏览
添加回答
举报
0/150
提交
取消