Определите абстрактный класс, который наследует внутренний интерфейс, но не реализует его - PullRequest
7 голосов
/ 22 мая 2010

с учетом обратной связи для леппи, которую он компилирует - но IMO некоторые недостатки: я хочу, чтобы каждый подкласс заставлял компилятор определять свое собственное свойство Uri. Код как сейчас:

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

Достаточно интересно, что класс I определяет, какие инериты сверху не показывают публичное свойство 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

Я хотел бы определить абстрактный класс, который наследуется от UserControl и моего собственного интерфейса IUriProvider, но не реализует его. Цель состоит в том, чтобы иметь возможность определять страницы (для silverlight), которые реализуют UserControl, но также предоставляют свои собственные 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()

Также Uri в определении - я хотел бы реализовать его как средство получения свойств - и у меня тоже есть проблемы с этим.

это не компилируется

type IUriProvider = 
    interface
        abstract member uriString: String with get;
end

Ответы [ 2 ]

8 голосов
/ 23 мая 2010

Вот способ сделать это:

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

Обратите внимание, что вы должны предоставить реализацию интерфейса (поскольку все реализации интерфейса в F # являются явными), но это может просто вернуться кучастники в классе.Тогда вы можете создать подкласс таким образом:

type ConcreteUriUserControl() =
    inherit UriUserControl()
    override this.Uri = null
    override this.UriString = "foo"
1 голос
/ 23 мая 2010

С точки зрения .NET вам нужно как минимум предоставить абстрактную реализацию для интерфейса. Но это опять-таки может оказаться проблематичным из-за доступности интерфейса по умолчанию, что потребует еще немного клея для явной реализации.

...