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

时间:2011-10-22 20:39:44

标签: c# class interface abstract

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

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

7 个答案:

答案 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();

     }