سؤال

وأنا لا يمكن العثور على بناء الجملة الصحيح لترميز نوع D يرث فئة أساسية B (مكتوب في C #) والصانعين له غير منشئ الضمني الفئة الأساسية:

وC # رمز:

public class B
{
    private int _i;
    private float _f;
    public B()
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i)
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i, float f)
    {
        _i = i;
        _f = f;
    }
}

وF # رمز:

type D() =
    inherit B()
    //how to inherit from other constructors ?

والشكر

هل كانت مفيدة؟

المحلول

ولقد وجدت طريقة للقيام بذلك بفضل هذا <وأ href = "http://langexplr.blogspot.com/2008/02/two-ways-of-defining-classes-in-f.html" يختلط = " نوفولو noreferrer "> بلوق !

type D =
    class
        inherit B

        new () = {
            inherit B()
        }
        new (i : int) = {
            inherit B(i)
        }
        new ((i,f) : int*single) = {
            inherit B(i, f)
        }
    end

نعم، انها مرهقة بعض الشيء، ولكن أود أن براين انها ليست الغالبية العظمى من الحالات.

وتحرير: في الواقع، والكلمات الرئيسية من الدرجة / نهاية ليست إلزامية لذلك (لذلك أنا استعادة ما قلته عن الإرهاق). كما قال براين على بلوق هنا ، F # يستنتج عادة نوع من نوع يجري تعريف، مما يجعل هذه الرموز لا لزوم لها / زائدة عن الحاجة.

type D =
    inherit B

    new () = {
        inherit B()
    }
    new (i : int) = {
        inherit B(i)
    }
    new ((i,f) : int*single) = {
        inherit B(i, f)
    }

نصائح أخرى

ومن مستندات: "يبدو أن الحجج لمنشئ الفئة الأساسية في قائمة وسيطة في بند يرث". على سبيل المثال:

type D(i: int) =
   inherit B(i)

ولست متأكدا ما اذا كان يمكنك الاتصال المختلفة منشئات الفئة الأساسية من مختلف F # الصانعين، لأن F # يتطلب من جميع الصانعين للذهاب من خلال منشئ "الأساسي" (لأن الحجج منشئ الأساسية هي في نطاق الطبقة بأكملها، بحيث يصبح لديهم أن initialised). في الحالة الخاصة بك، يمكنك أن تفلت من العقاب لأن الفئة الأساسية لديه منشئ القصوى:

type D(i : int, f : float) =
  inherit B(i, f)
  new(i : int) = D(i, 0.0)
  new() = D(0, 0.0)

ولكن لفئة دون قاعدة منشئ القصوى لست متأكدا من هذا الأمر ممكن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top