2013-06-16 2 views
0

Я получаю класс из базового абстрактного класса. Мой абстрактный класс имеет четыре абстрактных метода. Я не хочу переопределять все методы в производном классе. Как мне это сделать, не объявляя производный класс абстрактным классом?Обход одного из методов абстрактного класса в производном классе без создания производного класса абстрактный класс

+0

Зачем вам это нужно? Вся идея абстрактных методов заключается в том, что вы * имеете *, чтобы переопределить их. –

+0

Скорее всего, вы хотите, чтобы виртуальные методы переопределяли в вашем производном классе – OzrenTkalcecKrznaric

+1

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

ответ

2

Не-абстрактный класс, производный от абстрактного класса сусла включает фактические реализаций всех унаследованных абстрактных метод и аксессорах (MSDN)

1

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

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

abstract class Vehicle 
{ 
    public abstract void Do(); 
} 

class Car : Vehicle 
{ 
    public virtual void Do(){ throw InvalidOperationException(); } 
} 

class Hyundai : Car 
{ 
    public override void Do(){ //implementation } 
} 

Возможно, альтернатива, чтобы сделать ваш базовый класс интерфейса и явно их реализации в производном классе (который скрыть его до некоторой степени).

interface Vehicle 
{ 
    void Do(); 
} 

class Car : Vehicle 
{ 
    void Vehicle.Do() 
    { 
     throw new InvalidOperationException(); 
    } 
} 

class Hyundai : Car 
{ 
    //Do is not available here unless you cast it to base type, ie Vehicle 
} 
+2

Не используйте для этой цели 'NotImplementedException'. Если намерение, которое вы хотите выразить, - «операция недействительна», используйте «InvalidOperationException». Используйте «NotImplementedException» во время разработки в качестве маркера для кода, который * будет разработан, но еще не выполнен *, а затем удалите их все перед отправкой. Если вы используете «NotImplementedException», чтобы означать, что «это намеренно не реализовано» и «это предназначено для реализации», вы настраиваете себя на путаные ошибки. –

+0

@EricLippert справедливая точка, имеет смысл, спасибо. Обновит его. – nawfal

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