2009-12-16 2 views
13

Прошу прощения, если я спрашиваю что-то глупое, но я полностью новичок в C# и ASP.NET. У меня ошибка в коде, и я не понимаю. Я работаю на Visual Studio 2008.Класс C# не реализует унаследованный абстрактный элемент

В этой строке кода:

public class SQLFAQProvider : DBFAQProvider 

Я получаю эту ошибку:

Moby.Commerce.DataAccess.FAQ.SQLFAQProvider does not implement inherited abstract member Moby.Commerce.DataAccess.FAQDBFAQProvider.DeleteFAQbyID(int)

Когда я иду в DBFAQProvider ошибка в этой строке кода:

public abstract DBFAQ DeleteFAQbyID(int fAQID); 

Что я должен изменить, чтобы исправить ошибку?

ответ

19

Первая мысль была бы реализовать абстрактный элемент в наследуемом классе ала:

public class SQLFAQProvider : DBFAQProvider 
{ 
    public override DBFAQ DeleteFAQbyID(int fAQID) 
    { 
     //TODO: Real Code 
     return null; 
    } 
} 
+5

Мне не имеет смысла, что для выполнения абстрактного элемента требуется ключевое слово переопределения. – DFTR

+2

Имо ключевое слово 'override' справедливо требуется в конкретном классе, поскольку абстрактный элемент может быть дополнительно переопределен в классе, полученном из конкретного. В противном случае он выглядел бы как член производного класса, переопределяющий не виртуальный или не абстрактный элемент. Кроме того, CLR должна быть способна провести различие между реализацией абстрактного элемента и потенциальным новым членом, который скрывает абстрактный. Тогда возникает реальный вопрос: почему это не разрешено, то есть одновременно переопределять и скрывать элемент (будь то абстрактный или виртуальный), так как не будет никакой двусмысленности. – GDS

1

Ваш подкласс (SQLFAQProvider) должен предоставить код реализации для метода DeleteFAQbyID, поскольку родительский класс (DBFAQProvider) этого не сделал.

20

Реализуйте метод DeleteFAQbyID в производном классе:

public override DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    // Put your code here 
} 

Точка абстрактного метод должен сказать (в абстрактном базовом классе): «Я хочу убедиться, что этот метод доступен в каждом конкретном классе, происходящем от меня» - вам решать обеспечить реализацию. Это немного похоже на метод в интерфейсе.

+0

Я бы перефразировал «Я хочу убедиться, что этот метод доступен в каждом конкретном классе, происходящем от меня», до «Я хочу убедиться, что каждый конкретный класс, исходящий от меня, реализует специальную логику для этого метода» – bradbury9

2

Когда класс наследуется от абстрактного класса, он должен реализовать все абстрактные методы, определенные указанным классом. Это интерфейс класса, абстрактные методы можно рассматривать как чистые виртуальные функции, т. Е. Функции, которые должны выполняться спускаемыми классами, но не имеют смысла быть реализованы в базовом классе.

9

Ваш подкласс должен явно реализовать этот конкретный метод.

Если вы не имеете ни малейшего представления о том, как это сделать, то, по крайней мере, сделать:

public override DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    throw new NotImplementedException("This isn't done yet"); 
} 
2

Поскольку ваш SQLFAQProvider класс не abstract, он должен реализовать каждый abstract метод, наследуемый.

Чтобы исправить это, реализовать метод DeleteFAQbyID в SQLFAQProvider, как это:

public override DBFAQ DeleteFAQbyID(int fAQID) { 
    //Do something 
} 

В качестве альтернативы, вы можете сделать свой SQLFAQProvider класс abstract, изменив его декларацию public abstract class SQLFAQProvider.

3

Когда вы наследуете класс в C#, вам необходимо реализовать все методы, помеченные как abstract, если только ваш класс не обозначен как abstract. Абстрактные классы - это те, которые не могут быть непосредственно созданы во время выполнения, поскольку они не полностью реализуют все необходимые методы, которые, по словам базового класса, должны существовать.

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

Чтобы устранить проблему либо пометить свой класс как абстрактный (с ожиданием, что еще один уровень наследования заполнит недостающие кусочки) или реализовать DeleteFAQbyId() в классе:

public DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    // write appropriate implementation here or: 
    throw new NotImplementedException(); 
    // or possibly NotSupportedException() if the operation should can't ever be supported. 
} 
+3

Обратите внимание, что для того, чтобы для реализации метода нужно объявить его как «переопределить», иначе ошибка будет сохраняться –

-2

В абстрактном классе используйте свойство объекта, например IsValid. Сделайте его возвратом абстрактного метода, который вы хотите переопределить в производном классе.

В абстрактном базовом классе:

public bool IsValid 
{ 
    get 
    { 
     return DeleteFAQbyID(); 
    } 
} 

public abstract bool DeleteFAQbyID(); 

В производном классе теперь он будет переопределить метод абстрактного класса.

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