定义一个继承infterface的抽象类,但不实现它

aka*_*nom 7 f# abstract-class interface

结合leppies反馈它编译 - 但IMO的一些缺点我希望编译器强制每个子类定义自己的Uri属性.代码现在是:

[<AbstractClass>] 
type UriUserControl() = 
    inherit UserControl()
    interface IUriProvider with 
        member this.Uri with get() = null
Run Code Online (Sandbox Code Playgroud)

有趣的是,我从上面定义了哪些内容并没有显示公共Uri属性:

type Page2() as this =
    inherit UriUserControl()
    let uriStr = "/FSSilverlightApp;component/Page2.xaml"
    let mutable uri = new System.Uri(uriStr, System.UriKind.Relative)
    do
        Application.LoadComponent(this, uri)

    member public this.Uri with get () = uri
Run Code Online (Sandbox Code Playgroud)

我想定义一个继承自UserControl和我自己的接口IUriProvider的抽象类,但是没有实现它.目标是能够定义实现UserControl的页面(用于silverlight),但也提供他们自己的Uri(然后将它们粘贴在列表/数组中并将它们作为集合处理:

type IUriProvider = 
interface
    abstract member uriString: String ;
    abstract member Uri : unit -> System.Uri ;
end

[<AbstractClass>] 
type UriUserControl() as this = 
    inherit IUriProvider with
        abstract member uriString: String ;
    inherit UserControl()
Run Code Online (Sandbox Code Playgroud)

也是定义中的Uri - 我想实现作为属性getter - 并且我也遇到了问题.

这不编译

type IUriProvider = 
    interface
        abstract member uriString: String with get;
end
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 8

这是一种方法:

type IUriProvider =  
    abstract member UriString: string
    abstract member Uri : System.Uri

[<AbstractClass>]  
type UriUserControl() as this =  
    inherit System.Windows.Controls.UserControl() 
    abstract member Uri : System.Uri
    abstract member UriString : string
    interface IUriProvider with 
        member x.Uri = this.Uri
        member x.UriString = this.UriString
Run Code Online (Sandbox Code Playgroud)

请注意,您必须提供接口的实现(因为F#中的所有接口实现都是显式的),但这可以仅返回到类中的抽象成员.那么你可以这样子类化:

type ConcreteUriUserControl() =
    inherit UriUserControl()
    override this.Uri = null
    override this.UriString = "foo"
Run Code Online (Sandbox Code Playgroud)