创建一个在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;
}
}
添加抽象方法:
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();
}