Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中如何将一个抽象类放入另一个抽象类?_C#_Inheritance_Abstract Class - Fatal编程技术网

在c#中如何将一个抽象类放入另一个抽象类?

在c#中如何将一个抽象类放入另一个抽象类?,c#,inheritance,abstract-class,C#,Inheritance,Abstract Class,这实际上是一个设计问题。 假设我有一个接口a和一个抽象方法m1、m2的类aa,它继承自a 我还有一个不同的接口b和一个继承自它的类bb public interface b { string n1(); string n2(); } public abstract class bb:b { public abstract string n1(); public abstract string n2(); } 我想强制继承aa的类实现bb类的方法(与必须实现m1和m2的方法

这实际上是一个设计问题。
假设我有一个接口a和一个抽象方法m1、m2的类aa,它继承自a

我还有一个不同的接口b和一个继承自它的类bb

public interface b
{
  string n1();
  string n2();
}

public abstract class bb:b
{
  public abstract string n1();
  public abstract string n2();
}  
我想强制继承aa的类实现bb类的方法(与必须实现m1和m2的方法相同)

正确的做法是什么

public abstract class aa:a
{
  public abstract string m1();
  public abstract string m2();
  public abstract bb()?? 
  or public abstract bb.n1()???
}
您可以执行以下操作之一:从bb类继承aa;在aa类中实现b接口; 在aa类中显式实现b接口:

//从bb类继承aa
公开摘要类别aa:a,bb{
公共抽象字符串m1();
公共抽象字符串m2();

//公共抽象字符串n1();//在第一个选项中,我没有写n1和n2,它是从继承中自动获得的……如果我写了,他会知道它与bb有关?他不会认为这是aa的方法?@user990635我很抱歉:你说得对,你不应该把n1()和n2()放在一起在第一种情况下显式地。为了重新声明(不推荐)一个方法,你应该像“public new string n1();”一样放置它,非常感谢:)顺便问一下,哪一个更好?第一个还是第二个?(我的意思是正确的设计)@user990635这取决于你的需求,第一个解决方案使用类继承,第二个解决方案使用接口。。。
public abstract class aa:a
{
  public abstract string m1();
  public abstract string m2();
  public abstract bb()?? 
  or public abstract bb.n1()???
}
// Inherit aa from bb class
public abstract class aa:a, bb {
  public abstract string m1();
  public abstract string m2();

  // public abstract string n1(); // <- From bb class
  // public abstract string n2(); // <- From bb class
}

// Implement b interface in aa class
public abstract class aa:a, b {
  public abstract string m1();
  public abstract string m2();

  public abstract string n1(); // <- From b interface
  public abstract string n2(); // <- From b interface
}

// Implement b interface in aa class explicitly
public abstract class aa:a, b {
  public abstract string m1();
  public abstract string m2();

  protected abstract string core_n1(); // <- Put (override) b interface implementation here
  protected abstract string core_n2(); // <- Put (override) b interface implementation here

  // Can't be abstract itself but can call an abstract method
  b.string n1() { // <- explicit implementation, mo public or other modifier here!
    return core_n1();
  }
  // Can't be abstract itself but can call an abstract method
  b.string n2() { // <- explicit implementation, mo public or other modifier here!
    return core_n2();
  }
}