2012-03-04 5 views
2

Я новичок в C# и пытаюсь понять классы и отношения «есть». Я пытался заставить часть кода работать, но я не могу понять, что это правильно.Наследование/классы в C#

Это выглядит следующим образом: http://pastebin.com/cQDusptB

У меня есть базовый класс, Млекопитающее, что один должен быть в состоянии создать экземпляры, давая имя млекопитающему в качестве входных данных. У меня также есть класс, Собака, которая является млекопитающим. Нужно также создать экземпляр этого, так же, как и млекопитающее.

Может ли кто-нибудь увидеть мои недостатки? Если да, можете ли вы объяснить, что я неправильно понял/забыл?

+0

Вы можете включить небольшой пример проблемы, имеющейся в вашем вопросе. Пастбин не требуется. –

ответ

1

У вас есть несколько вопросов здесь. Для одного, конструкторы не могут быть помечены как виртуальные или переопределенные. Другая проблема заключается в том, что вы пытаетесь вызвать метод .Name без круглых скобок. Исправленная версия выглядит так:

public class Mammal 
{ 
    protected string _Name; 

    public virtual string Name() 
    { 
      return (this._Name + " - of type " + this.GetType()); 
    } 
    public Mammal(string Name) 
    { 
     this._Name = Name; 
    } 
} 
public class Dog : Mammal 
{ 
    public Dog(string Name) : base(Name) 
    { 
    } 

    public override string Name() 
    { 
     return (base._Name + "Dog"); 
    } 
} 

static void Main() 
{ 
    Mammal AnimalA = new Mammal("SubjectA"); 
    Console.WriteLine("{0}", AnimalA.Name()); 

    Mammal AnimalB = new Dog("SubjectB"); 
    Console.WriteLine("{0}", AnimalB.Name()); 
    Console.ReadLine(); 
} 
+0

Спасибо! - Я понимаю изменения! - Мне интересно, есть ли какие-нибудь легкие обходные пути, если бы я хотел для вызова .Name без()? – Treelink

+2

Используйте [свойства] (http://msdn.microsoft.com/en-us/library/x9fsa0sw (v = vs.100) .aspx) –

5

При публикации таких вопросов полезно также разместить сообщение об ошибке, предоставленное вам компилятором.

Может ли кто-нибудь увидеть мои недостатки?

У вас есть виртуальный конструктор.

не могли бы вы объяснить, что я неправильно понял/забыл?

Конструкторы не наследуется в C# и, следовательно, не имеет смысла, чтобы пометить их как либо виртуальный или переопределение.

3

Конструктор собаки следует называть «Собака». Вы не можете/не должны переопределять «Млекопитающее». Кроме того, конструктор Mammal не должен быть виртуальным.

public class Mammal 
{ 

    public Mammal(string name) 
    { 
     //.... 
    } 
} 

public class Dog : Mammal { 

    public Dog(string name) : base(name) 
    { 
    } 
} 

Вы передаете аргументы конструктору базового класса, используя ключевое слово «base» (см. Код выше).

Обязательно заберите хорошую книгу на C#, чтобы правильно понять язык.

+0

Спасибо. Это имеет смысл :) - У меня есть книга, но я не совсем понял ее часть :( – Treelink

1

Конструкторы не наследуются и не переопределяются.

  • Потеряйте ключевое слово «virtual» из конструктора Mammal в классе Mammal.
  • Удалите попытку переопределения смены млекопитающего в классе Dog.
  • Замените конструктор Собаки, которая вызывает млекопитающее один (как это):

общественных собак (имя строки): база (имя) {

}

Теперь, когда собака построена, она вызовет конструктор базового класса млекопитающего, передав указанное имя.