我想在c#中创建一个抽象类,它从不同的接口“继承”,但是将具体的实现留给了子类。然而,编译器抱怨说,该类没有实现接口中指定的方法。我已经习惯了Java总是有用的,所以我不确定它应该如何在c#中工作。无论如何,这是我的代码:
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
}
答案 0 :(得分:9)
添加抽象方法:
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();
}
}
答案 1 :(得分:7)
这是正确的方法。
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
public abstract void Dispose();
}
我不知道你的IPartImportsSatisfiedNotification
界面的定义,所以我的样本只能提供IDisposable
中定义的方法......以同样的方式为IPartImportsSatisfiedNotification
执行。
答案 2 :(得分:1)
您需要添加“实现”这些接口的抽象方法。
例如:
public abstract void Dispose(); // implements IDisposable
答案 3 :(得分:0)
您可以在抽象类中声明接口所期望的方法和属性为abstract。这会强制子类仍然执行实现,但不违反C#的接口规则。
答案 4 :(得分:0)
基础知识中的抽象类是一个普通类,所以他也必须实现这些方法。
如果你想进一步实现,把虚方法(或抽象)放在抽象类本身
答案 5 :(得分:0)
正如其他人所指出的,您需要在基类中将方法标记为抽象,这将强制派生类实现。您可以在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;
}
}
答案 6 :(得分:0)
您需要在抽象类中添加抽象方法。
public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification
{
private string name;
public MyClass(string name)
{
this.name = name;
}
public abstract void dispose();
public abstract void OnImportsSatisfied();
}