Определите абстрактный класс, который наследовал infterface, но не реализует его

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

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

Достаточно интересный, класс I определяет, какой inerits сверху не показывает общедоступное свойство 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
7
задан abatishchev 12 March 2014 в 07:52
поделиться

2 ответа

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

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"
8
ответ дан 7 December 2019 в 03:12
поделиться

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

1
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: