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

问题描述

给定一个接口/基类,在其方法参数周围定义了契约,当在实现类中不支持这些方法中的任何一个时,我应该在抛出 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 (将#修改为@)