2013-09-03 7 views
1

Пусть у меня есть этот класс:наследует от базового класса

class foo 
{ 
    public foo(Guid guid) 
    { 
     //some code here 
    } 

    public foo(Guid guid, bool myBool) 
    { 
     //some other code here 
    } 

    //Here I have a bunch of method/properties 

    public void GenX(bool french, int width) 
    { 
     //my method implementation 
    } 
} 

и у меня есть еще один класс, который делает в основном все равно, чем foo за исключением реализации этого метода public GenX(bool french, int width) и construtor должны отличаться от foo .

Если я реализую bar таким образом компилятор жалуется: 'foo' does not contain a constructor that takes '0' arguments

class bar : foo 
{ 
    public bar(Guid guid, bool myBool) 
    { 
     //some code here 
    } 

    new public void GenX(bool french, int width) 
    { 
     //my new method implementation 
    } 

    //I will be using the implementation of `foo` for the rest of the methods/properties 
} 

Что я делаю неправильно? Это правильный способ сделать это?

Если это не ясно, я прийти извинений, и я постараюсь сделать его более ясным

+0

Что касается вашего 'метода bar.GenX', вы намерены теневым метода базы, либо вы имели в виду, чтобы изменить это? – valverij

+0

@valverij на данный момент допустим, что это желаемое поведение. Мне нужно будет проверить в моем контексте, чтобы увидеть, следует ли мне просто переопределить –

+0

Вы уверены, что это целый код? Не должно быть: class bar: foo Пожалуйста, покажите нам строку, которая вызывает эту ошибку. – Koscik

ответ

9

Вы должны убедиться, что базовый конструктор вызывается.

Вы можете сделать это так:

class bar : foo 
{ 
    public bar(Guid g, bool b) : base (g) 
    { 
     // code here 
    } 
} 

Поскольку вы не указали это в коде, компилятор будет пытаться вызывать конструктор по умолчанию по умолчанию/неявно. Однако, поскольку ваш базовый класс не имеет конструктора по умолчанию (поскольку вы указали другой конструктор без указания конструктора по умолчанию), он не может его вызвать. Следовательно, вам нужно сообщить компилятору, какой конструктор базового класса он должен использовать.

В случае, если конструктор в вашем унаследованном классе делает что-то совсем другое, то конструктор в вашем базовый классе, и не свистеть, чтобы повторно использовать конструктор базового класса, вы можете сделать это:

class foo 
{ 
    protected foo() 
    { 
     // default constructor which is protected, so not useable from the 'outside' 
    } 

    public foo(Guid g) 
    {} 

    public foo(Guid g, bool b) : this(g) 
    {} 

    public virtual void GenX() {} 
} 

class bar : foo 
{ 
    public bar(Guid g, bool b) : base() 
    {} 

    public override void GenX() {} 
} 
+0

Мне нужно сделать это, даже если код в базовом конструкторе не имеет значения для 'bar'? –

+0

Что именно вы имеете в виду? –

+3

Кроме того, вы можете объявить foo.GenX как виртуальный и использовать ключевое слово override вместо нового ключевого слова far.GenX. Это сделает GenX полиморфным. – Polyfun

0

попробовать это:

class foo 
{ 
    public foo(Guid guid) 
    { 
     //some code here 
    } 

    public foo(Guid guid, bool myBool,bool fooclass = true) 
    { 

     if (fooclass) 
     { 
      //some other code here 
     } 

    } 

    //Here I have a bunch of method/properties 

    public void GenX(bool french, int width) 
    { 
     //my method implementation 
    } 
} 

class bar : foo 
{ 
    public bar(Guid guid, bool myBool,bool barclass = true) : base(guid,myBool,false) 
    { 
     //some code here 
    } 

    new public void GenX(bool french, int width) 
    { 
     //my new method implementation 
    } 
}         
+0

это не выглядит хорошим способом справиться с этим. Также я нахожусь в C# 3.0, поэтому я не могу использовать параметр по умолчанию (это не было задано в вопросе ... но как-то было непонятным для вопроса) –

Смежные вопросы