#c# #class #interface #abstract
#c# #класс #интерфейс #аннотация
Вопрос:
Я хотел бы создать абстрактный класс в c #, который «наследует» от разных интерфейсов, но оставляет конкретную реализацию подклассу. Однако компилятор жалуется, что класс не реализует методы, указанные в интерфейсах. Я привык к Java, где это всегда работало, поэтому я не уверен, как это должно работать в c #. В любом случае, это мой код:
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
}
Комментарии:
1. Итак, добавьте необходимые методы, но пометьте их абстрактными
Ответ №1:
Добавление абстрактных методов:
public interface IPartImportsSatisfiedNotification
{
void SomeMethod();
}
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
public abstract void SomeMethod();
public abstract void Dispose();
}
public class SubClass : MyClass
{
public SubClass(string someString) : base(someString)
{
}
public override void SomeMethod()
{
throw new NotImplementedException();
}
public override void Dispose()
{
throw new NotImplementedException();
}
}
Ответ №2:
Это правильный способ сделать это.
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
public abstract void Dispose();
}
Я не знаю определения вашего IPartImportsSatisfiedNotification
интерфейса, поэтому я в своем примере могу предоставить только методы, определенные в IDisposable
… Сделайте это IPartImportsSatisfiedNotification
таким же образом.
Ответ №3:
Вам нужно будет добавить абстрактные методы, которые «реализуют» эти интерфейсы.
Так, например:
public abstract void Dispose(); // implements IDisposable
Ответ №4:
Вы можете просто объявить методы и свойства, ожидаемые интерфейсами, как абстрактные в вашем абстрактном классе. Это заставляет подклассы по-прежнему выполнять реализацию, но не нарушает правила интерфейсов C #.
Ответ №5:
абстрактный класс в basics — это обычный класс, поэтому он также должен реализовывать эти методы.
если вам нужны дополнительные реализации, поместите виртуальные методы (или абстрактные) в сам абстрактный класс
Ответ №6:
Как отмечалось другими, вам нужно будет пометить методы как абстрактные в вашем базовом классе, что заставит производные классы реализовывать. Вы можете запустить это как программу на C # в LINQPad
void Main()
{
DerivedClass dc = new DerivedClass("hello, world");
Console.Out.WriteLine(dc);
string result = dc.Notify("greetings");
Console.Out.WriteLine(result);
}
public interface IPartImportsSatisfiedNotification
{
string Notify(string msg);
}
public abstract class MyClass : IPartImportsSatisfiedNotification
{
protected string name;
public MyClass(string name)
{
this.name = name;
}
abstract public string Notify(string msg);
}
public class DerivedClass : MyClass
{
public DerivedClass(string name) :base(name)
{
}
public override string Notify(string msg)
{
return string.Format("Msg {0} from {1}", msg, this.name);
}
public override string ToString()
{
return this.name;
}
}
Ответ №7:
вам нужно добавить абстрактный метод в свой абстрактный класс.
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
public abstract void dispose();
public abstract void OnImportsSatisfied();
}