创建一个在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(); }