слияние 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
Вот способ сделать это:
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"
С точки зрения .NET вам потребуется по крайней мере предоставить абстрактную реализацию интерфейса. Но это снова может оказаться проблематичным из-за доступности интерфейса по умолчанию, что потребует еще немного клея для явной реализации.