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

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

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

添加抽象方法:

  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 

您只需在抽象类中声明接口所期望的方法和属性为abstract。 这会强制子类仍然执行,但不违反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(); }