Как реализовать абстрактный класс в F #?
После того, как я увидел этот сеанс PDC, я хотел попробовать узнать немного F #. Поэтому я думал, что лучший способ - переписать в F # то, что я уже сделал на С#, но мой мозг просто отказывается думать в функциональном режиме.
У меня есть этот абстрактный класс, который имеет некоторые абстрактные методы и некоторые виртуальные методы. Я также хотел бы переопределить некоторые из виртуальных методов. Этот класс написан на С# и скомпилирован, и я не собираюсь переписывать его я F #.
Поэтому мой вопрос:
- У кого-нибудь есть короткий пример того, как реализовать абстрактный класс, абстрактный метод и виртуальный метод.
- Можно ли перегружать конструкторы?
- Есть ли какие-либо ограничения, если я хочу скомпилировать его в dll и сделать его доступным для моих программ на С#.
Любая помощь будет оценена по достоинству.
Обновление:
Я действительно очень оценил ответ Брайана, но мне все еще не ясно, поэтому я хочу уточнить. Предположим, что это мой абстрактный класс, написанный на С# и скомпилированный в 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 # заинтересован получить какую-то документацию, которую я нашел в блоге Don Syme (создатель F #) свободных главах своей книги F # Expert. Вы можете загрузить их в формате doc.
Некоторые другие ресурсы, которые могут вас заинтересовать:
Ответы
Ответ 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)