После того, как я увидел сеанс это PDC, я хотел попробовать немного изучить F#. Поэтому я подумал, что лучше всего было бы переписать на F# то, что я уже сделал на C#, но мой мозг просто отказывается думать в функциональном режиме. У меня есть этот абстрактный класс, в котором есть несколько абстрактных методов и несколько виртуальных методов. Я также хотел бы переопределить некоторые виртуальные методы. Этот класс написан на C# и скомпилирован, и я не собираюсь переписывать его на F#. Итак, мой вопрос:
Любая помощь будет оценена по достоинству.
Обновлять: Я действительно очень оценил ответ Брайана, но мне он все еще неясен, поэтому я хочу уточнить. Представим, что это мой абстрактный класс, написанный на C# и скомпилированный в dll. Как мне реализовать это на F#?
public abstract class MyAbstractClass
{
public abstract Person GetFullName(string firstName, string lastName);
public abstract bool TryParse(string fullName, out Person person);
public virtual IEnumerable<Person> GetChildren(Person parent)
{
List<Person> kids = new List<Person>();
foreach(Child person in GroupOfPeople)
{
if (person.Parent == parent)
kids.Add(child as Person);
}
return kids;
}
public virtual IEnumerable<Child> GroupOfPeople { get; set; }
}
Некоторая документация для тех, кто ищет ресурсы F#: - если какой-либо другой F# заинтересован в получении некоторой документации, которую я нашел в блоге Дона Сайма (создателя F#) бесплатные главы его книги F# Expert. Вы можете скачать их в формате doc.
Некоторые другие ресурсы, которые могут быть интересны:





Вот пример кода
type IBaz =
abstract member Baz : int -> int
[<AbstractClass>]
type MyAbsClass() =
// abstract
abstract member Foo : int -> int
// virtual (abstract with default value)
abstract member Bar : string -> int
default this.Bar s = s.Length
// concrete
member this.Qux x = x + 1
// a way to implement an interface
abstract member Baz: int -> int
interface IBaz with
member this.Baz x = this.Baz x
type MySubClass(z : int) =
inherit MyAbsClass()
override this.Foo x = x + 2
override this.Bar s = (base.Bar s) - 1
override this.Baz x = x + 100
member this.Z = z
new () = MySubClass(0)
let c = new MySubClass(42)
printfn "%d %d %d %d %d" c.Z (c.Foo 40) (c.Bar "two") (c.Qux 41) (c.Baz 42000)
На самом деле я имел в виду, возможно ли иметь абстрактный член, который взаимодействует с интерфейсом. Например. интерфейс IBaz с абстрактным членом Baz: int -> int
Нет, этот синтаксис недопустим, поскольку он был бы примерно эквивалентен «абстрактному классу C: System.IComparable {abstract int System.IComparable.CompareTo (object x);}» в C#, что также недопустимо.
Возможно ли, чтобы абстрактный класс F# тоже реализовал интерфейс?