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

6

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

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

因此,添加所需的方法,但将它们标记为抽象。 - Hogan
7个回答

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();
        }
    }

7

这是正确的做法。

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

        public abstract void Dispose();
    }

我不知道你的 IPartImportsSatisfiedNotification 接口的定义,所以我的示例只提供了 IDisposable 中定义的方法... 请按照相同方式对 IPartImportsSatisfiedNotification 进行操作。


1

你需要添加抽象方法来“实现”这些接口。

例如:

 public abstract void Dispose(); // implements IDisposable

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;
}
 }

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

     }

0
你可以在抽象类中声明接口所期望的方法和属性为抽象的。这会强制子类仍然进行实现,但不违反 C# 接口的规则。

0

抽象类在基础中是一个普通的类,因此它也必须实现这些方法。

如果您想要更多的实现,请将虚拟方法(或抽象方法)放在抽象类本身中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接