2013-11-17 3 views
1

Мы знаем, если класс имеет абстрактный метод, он будет абстрактным. Он не может получить экземпляр. Но почему может быть метод экземпляра? Имеет ли смысл?Почему абстрактный класс может иметь метод экземпляра?

public abstract class AbsClass 
{ 
    public abstract void GetA(); 

    public void Getb() 
    { } 
} 

ответ

2

Не каждый метод абстрактного класса должен быть абстрактным - когда вы выходите из класса, производные классы наследуют не абстрактные методы из базового класса. Чрезвычайно распространено желание предоставлять функциональность базового класса, которая является общей для всех производных классов (на самом деле, хорошая практика программирования заключается в том, чтобы вытащить общую функциональность до базового класса, чтобы избежать дублирования кода в различных производных классах). Также чрезвычайно часто необходимо предоставлять функциональность по умолчанию в базовом классе, которая затем может быть переопределена отдельными производными классами.

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

1

метод будет реализация для конкретного класса, который является производным от AbsClass. Абстрактный означает, что вы не можете создать экземпляр класса, а не то, что он не может иметь какие-либо методы с реализацией. Вы также можете иметь экземпляры данных экземпляра в абстрактном классе.

В качестве примера:

public class MyAbsClass : AbsClass 
{ 
} 

MyAbsClass mine = new MyAbsClass(); 
mine.Getb(); //This would call the implementation in AbsClass 

AbsClass Если не были interface, однако, не выполнение будет разрешено.

1

Да, это точно определено. Это не может быть вызывается до тех пор, пока есть экземпляр, который, в свою очередь, указывает, что вы должны иметь конкретный подтип, но как только вы делаете метод вполне можно использовать, например:

AbsClass foo = new ConcreteClass(); 
foo.Getb(); 

Или в самом деле :

ConcreteClass foo = new ConcreteClass(); 
foo.Getb(); 

(так как подтип наследует любые типы, определенные на базовые типах)

Это довольно часто для таких методов в себя используют abstract или virtual методов типа - или я ndeed быть virtual.

2

Да, это имеет смысл.

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

Пример производного класса:

public abstract class AbsClass 
{ 
    public abstract void GetA(); 

    public void Getb() 
    { } 
} 

public class DerivedClass : AbsClass 
{ 

} 

Следующий код будет выполняться Getb) код абстрактного класса (в:

var derivedClass = new DerivedClass(); 
derivedClass.Getb(); 

(Обратите внимание, что в приведенном выше примере, код не будет компиляции, если только ваш производный класс не реализовал GetA(), поскольку он объявлен абстрактным и поэтому должен быть реализован в любом конкретном производном классе)

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