创建一个在c#中实现多个接口的抽象类

本文关键字:实现 接口 抽象类 一个 创建 | 更新日期: 2023-09-27 18:12:20

我想在c#中创建一个抽象类,它"继承"了不同的接口,但将具体实现留给子类。然而,编译器抱怨该类没有实现接口中指定的方法。我已经习惯了Java,所以我不确定它在c#中应该如何工作。不管怎样,这是我的代码:

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

创建一个在c#中实现多个接口的抽象类

添加抽象方法:

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

这是正确的方法。

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

我不知道你的IPartImportsSatisfiedNotification接口的定义,所以我的示例只能提供IDisposable中定义的方法。。。以同样的方式对IPartImportsSatisfiedNotification执行此操作。

您将需要添加"实现"这些接口的抽象方法。

例如:

 public abstract void Dispose(); // implements IDisposable

您只需在抽象类中将接口期望的方法和属性声明为抽象。这迫使子类仍然执行实现,但不会违反C#的接口规则。

抽象类在基础上是一个普通类,因此他还必须实现这些方法。

如果您想要进一步的实现,请将虚拟方法(或抽象(放在抽象类本身

正如其他人所指出的,您需要在基类中将方法标记为抽象方法,这将强制实现派生类。您可以在LinqPad 中将其作为C#程序运行

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;
}
 }

您需要在抽象类中添加抽象方法。

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