Создание абстрактного класса, который реализует несколько интерфейсов в c#

#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();

     }