【问题标题】:Returning interfaces from methods从方法返回接口
【发布时间】:2020-07-24 22:31:11
【问题描述】:

在 Vala 编程语言中,有没有办法声明一个接口方法,该方法返回一个实现接口的对象?例如,如果我需要一个从某个地方读取某些内容的方法,我可以这样声明它:

interface SeekableInput: GLib.InputStream, GLib.Seekable {}

interface Reader {
  SeekableInput read();
}

现在我想实现一个Reader,它只是从内存中读取到MemoryInputStream,根据其文档,它实际上是一个实现Seekable的InputStream。

class MemoryReader: Reader {
  GLib.MemoryInputStream _stream;

  // This produces "... overriding method ... is incompatible ... expected return type ...":
  GLib.MemoryInputStream read() { return _stream; }

  // This produces "Cannot convert from ...":
  SeekableInput read() { return _stream; }
}

我不能声明read() 来返回MemoryInputStream,因为会有另一个Reader 读入BufferedInputStream

【问题讨论】:

    标签: vala


    【解决方案1】:

    这称为铸造。像这样的东西应该可以工作:

    class MemoryReader: Reader {
      GLib.MemoryInputStream _stream;
    
      SeekableInput read() { return (SeekableInput)_stream; }
    }
    

    【讨论】:

    • 你确定它是正确的吗?因为 MemoryInputStream 实际上并没有实现我的 SeekableInput,而且我不知道这个转换的合法性有多大。
    • 根据 Valadoc.org 上的MemoryInputStream dcoumentation,它实现了 InputStream 和 Seekable,这是您的 SeekableInput 接口所需要的。我还没有编写测试程序来证明这一点,这就是为什么 MCVE (Minimal Complete Verfifiable Example) 有帮助
    【解决方案2】:

    我认为您需要在这里为您的 GLib.MemoryInputStream 提供一个包装器,以便编译时不会出错:

    interface SeekableInput: GLib.InputStream, GLib.Seekable {}
    
    interface Reader {
        SeekableInput read();
    }
    
    class MemorySeekableInput: SeekableInput {
        private GLib.MemoryInputStream stream;
    
        public MemorySeekableInput(GLib.MemoryInputStream stream){
            this.stream = stream;
        }
    
        // ... implement all abstract methods for InputStream and Seekable
    }
    
    class MemoryReader: Reader {
        GLib.MemoryInputStream _stream;
    
      SeekableInput read() { return new MemorySeekableInput(_stream); }
    }
    

    你的代码不会编译,因为 SeekableInput 是一个新的唯一类型,它不等于 GLib.MemoryInputStream 类型,即使它实现了 InputStream 和 Seekable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多