Как реализовать абстрактный класс на F#?

После того, как я увидел сеанс это PDC, я хотел попробовать немного изучить F#. Поэтому я подумал, что лучше всего было бы переписать на F# то, что я уже сделал на C#, но мой мозг просто отказывается думать в функциональном режиме. У меня есть этот абстрактный класс, в котором есть несколько абстрактных методов и несколько виртуальных методов. Я также хотел бы переопределить некоторые виртуальные методы. Этот класс написан на C# и скомпилирован, и я не собираюсь переписывать его на F#. Итак, мой вопрос:

  1. есть ли у кого-нибудь короткий образец того, как реализовать абстрактный класс, абстрактный метод и виртуальный метод
  2. можно ли иметь перегруженные конструкторы?
  3. есть ли какие-либо ограничения, если я хочу скомпилировать его в dll и сделать доступным для моих программ на C#.

Любая помощь будет оценена по достоинству.


Обновлять: Я действительно очень оценил ответ Брайана, но мне он все еще неясен, поэтому я хочу уточнить. Представим, что это мой абстрактный класс, написанный на 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.

Некоторые другие ресурсы, которые могут быть интересны:

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
2 779
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пример кода

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)

Возможно ли, чтобы абстрактный класс F# тоже реализовал интерфейс?

Stringer 27.10.2009 02:48

На самом деле я имел в виду, возможно ли иметь абстрактный член, который взаимодействует с интерфейсом. Например. интерфейс IBaz с абстрактным членом Baz: int -> int

Stringer 27.10.2009 03:40

Нет, этот синтаксис недопустим, поскольку он был бы примерно эквивалентен «абстрактному классу C: System.IComparable {abstract int System.IComparable.CompareTo (object x);}» в C#, что также недопустимо.

Brian 27.10.2009 04:02

Другие вопросы по теме