微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该在不受支持的覆盖方法上验证接口契约吗?

如何解决我应该在不受支持的覆盖方法上验证接口契约吗?

给定一个接口/基类,在其方法参数周围定义了契约,当在实现类中不支持这些方法中的任何一个时,我应该在抛出 NotSupportedException 之前仍然确保遵守契约还是我应该完全忽略接口中的合同并立即抛出?

假设我有以下界面:

    public interface IMySerializable<T>
    {
        /// <summary>
        ///     Some docs
        /// </summary>
        /// <param name="reader">More docs</param>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="reader" /> is null. </exception>
        T Read(TextReader reader);

        /// <summary>
        ///     Some docs
        /// </summary>
        /// <param name="writer">More docs</param>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="writer" /> is null. </exception>
        void Write(T value,TextWriter writer);
    }

现在,我想为特定类型创建一个实现,但我只支持读取,不支持写入。

什么是更正确的实现?

这个(直接抛出NotSupportedException):

    public class StringMySerializable : IMySerializable<string>
    {
        public string Read(TextReader reader)
        {
            _ = reader ?? throw new ArgumentNullException(nameof(reader));

            return reader.ReadToEnd();
        }

        public void Write(string value,TextWriter writer)
        {
            throw new NotSupportedException();
        }
    }

或者这个(确保接口契约被保留,然后抛出NotSupportedException)?

    public class StringMySerializable : IMySerializable<string>
    {
        public string Read(TextReader reader)
        {
            _ = reader ?? throw new ArgumentNullException(nameof(reader));

            return reader.ReadToEnd();
        }

        public void Write(string value,TextWriter writer)
        {
            _ = writer ?? throw new ArgumentNullException(nameof(writer));
            throw new NotSupportedException();
        }
    }

我更喜欢保留接口契约的版本,因为这样更容易发现错误。例如,这就是我在实现装饰器或组合时所做的(在实现中添加相同的验证,即使它已经被内部类验证)。

但是,我从来没有在任何地方看到过针对“不受支持方法”的特定情况提到的这一点,而且我未能找到针对此特定情况的任何具体指南。

实现它的正确方法是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。