Создание абстрактного класса, который реализует несколько интерфейсов в C # - PullRequest
6 голосов
/ 23 октября 2011

Я хотел бы создать абстрактный класс в c #, который «наследует» от разных интерфейсов, но оставляет конкретную реализацию подклассу.Однако компилятор жалуется, что класс не реализует методы, указанные в интерфейсах.Я привык к Java, где это всегда работало, поэтому я не уверен, как это должно работать в c #.Во всяком случае, это мой код:

 public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
 {
   private string name; 
   public MyClass(string name)
   {
       this.name = name; 
   }
 }

Ответы [ 7 ]

9 голосов
/ 23 октября 2011

Добавить абстрактные методы:

    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();
        }
    }
7 голосов
/ 23 октября 2011

Это правильный способ сделать это.

    public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
    {
        private string name;
        public MyClass(string name)
        {
            this.name = name;
        }

        public abstract void Dispose();
    }

Я не знаю определения вашего IPartImportsSatisfiedNotification интерфейса, поэтому мой пример может предоставить только методы, определенные в IDisposable ... Сделайте это для IPartImportsSatisfiedNotification таким же образом.

1 голос
/ 23 октября 2011

Вам нужно будет добавить абстрактные методы, которые «реализуют» эти интерфейсы.

Так, например:

 public abstract void Dispose(); // implements IDisposable
0 голосов
/ 04 августа 2013

вам нужно добавить абстрактный метод в ваш абстрактный класс.

 public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
     {
       private string name; 
       public MyClass(string name)
       {
           this.name = name; 
       }
        public abstract void dispose();
        public abstract void OnImportsSatisfied();

     }
0 голосов
/ 23 октября 2011

Как отмечали другие, вам нужно пометить методы как абстрактные в вашем базовом классе, что заставит реализовать производные классы. Вы можете запустить это как программу на 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;
}
 }
0 голосов
/ 23 октября 2011

абстрактный класс в основах - это нормальный класс, поэтому он также должен реализовать эти методы.

если вам нужны дальнейшие реализации, поместите виртуальные методы (или абстрактный) в сам абстрактный класс

0 голосов
/ 23 октября 2011

Вы можете просто объявить методы и свойства, которые ожидают интерфейсы, как абстрактные в вашем абстрактном классе. Это заставляет подклассы все еще выполнять реализацию, но не нарушает правила интерфейсов C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...