Можно ли определить член в дочернем классе, не определяя его в абстрактном родительском классе?C # - PullRequest
6 голосов
/ 12 февраля 2011

Просто чтобы уточнить, действительно ли обязательно, чтобы все члены дочернего класса были объявлены в абстрактном классе над ним?

Было бы возможно что-то вроде этого:

public abstract class MyParent
{
    public int x { get; set; }
}
public class MyChild : MyParent
{
    public int x { get; set; }
    public string MyName { get; private set; }
}

Это просто пример ... В этом случае свойство MyName не определено в родительском классе, но оно есть в дочернем классе ... Возможно ли это?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 12 февраля 2011

Да, вы можете объявить дополнительные свойства и методы в дочернем классе.

Однако, если вы используете переменную, объявленную как тип предка, вы сможете получить доступ только к членам, определенным в типе предка, через эту переменную. Единственный способ добраться до специальных вещей дочернего класса - это привести тип к дочернему типу.

Как отступление: дочерний класс должен не дублировать объявления, сделанные в предке. Ваше свойство int x здесь вызовет проблемы, потому что вокруг будут бегать два разных свойства x.

Конкретный (неабстрактный) дочерний класс необходим для переопределения любых виртуальных методов или свойств, объявленных в абстрактном предке. Виртуальные и переопределить оба требуют определенных ключевых слов в объявлении.

2 голосов
/ 12 февраля 2011

да, конечно, это нормально для вас.Единственное, что вы не можете сделать, это получить доступ к свойству MyName, если вы просматриваете родительский объект.В этом случае у вас есть доступ к тем, которые являются общими для MyParent.

2 голосов
/ 12 февраля 2011

Да, в дочернем классе можно создавать новых членов, которых нет в родительском классе. В этом весь смысл иметь детские классы. Предполагается, что дочерний класс «расширяет» родительский класс путем добавления новых членов или изменения поведения существующих членов

Однако вам не нужно заново создавать элементы родительского класса в дочерних классах. Дочерние классы получают все члены из родительского класса автоматически.

Код, который вы дали, является легальной программой на C #, и это означает, что вы намерены создать другое int x для дочернего класса. Часто это не так, и компилятор Microsoft C # предупредит вас об этом.

...