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

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

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

person Pedro    schedule 22.10.2011    source источник
comment
Поэтому добавьте необходимые методы, но пометьте их как абстрактные.   -  person Hogan    schedule 23.10.2011


Ответы (7)


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

    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();
        }
    }
person Acaz Souza    schedule 22.10.2011

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

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

        public abstract void Dispose();
    }

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

person dknaack    schedule 22.10.2011

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

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

 public abstract void Dispose(); // implements IDisposable
person Hans Kesting    schedule 22.10.2011

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

person Keith.Abramo    schedule 22.10.2011

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

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

person Royi Namir    schedule 22.10.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;
}
 }
person What Would Be Cool    schedule 22.10.2011

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

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

     }
person Community    schedule 04.08.2013