C# 有没有一种方法可以让我的基类和派生类分别实现接口方法?

C# 有没有一种方法可以让我的基类和派生类分别实现接口方法?,c#,class,inheritance,C#,Class,Inheritance,我知道这个问题令人困惑,但很难为这个问题想出一个好的标题,所以我将在这里详细描述 我有一个带有两个方法的接口A,IsValidRow和IsFileValid 我有一个基类B和一个派生类C 这里的目标是,我希望基类实现IsFileValid,因此它可以被所有从基类派生的类继承,每个派生类实现IsValidRow 问题是IsFileValid在内部调用IsValidRow。如果我这样做 B:A A要求在B中实现IsValidRow 目前,我的派生类C继承自基类和接口atm 只要满足了这两个方法的要

我知道这个问题令人困惑,但很难为这个问题想出一个好的标题,所以我将在这里详细描述

我有一个带有两个方法的接口A,IsValidRow和IsFileValid 我有一个基类B和一个派生类C 这里的目标是,我希望基类实现IsFileValid,因此它可以被所有从基类派生的类继承,每个派生类实现IsValidRow

问题是IsFileValid在内部调用IsValidRow。如果我这样做

B:A
A要求在B中实现IsValidRow

目前,我的派生类C继承自基类和接口atm

只要满足了这两个方法的要求,我不介意对所有内容进行重新构造—一个方法将在基类或其他对象中实现一次并跨继承,而另一个方法将在每个派生类中实现

interface IFileValidator
{
    Pair<bool, string> IsValidRow(List<string> row);

    bool IsFileValid(string file);
}

class FileValidator : IFileValidator
{
    public bool IsFileValid(string file)
    {
        // calls IsValidRow()
        IsValidRow();
    }
 }

class FacilitiesCalendarValidator : FileValidator, IFileValidator
{

    public Pair<bool, string> IsValidRow(List<string> row)
    {
            //stuff
    }
 }

这两种情况都有可能

对于可选的可重写方法,将基类方法声明为虚方法,并在子类中重写

对于必须由子类提供实现的方法,请将该类和方法标记为抽象

您不必重写子类中的虚拟方法,因此实现是继承的,除非您明确决定重写

例如:

 interface IInterface
 {
     int Transform(int a, int b);
     int AnotherTransform(int a, int b);
 }

 abstract class A : IInterface
 {
    public virtual int Transform(int a, int b)
    {
        return a + b;
    }

    public abstract int AnotherTransform(int a, int b);
 }

 class B : A
 {
    public override int Transform(int a, int b)
    {
        return a - b;
    }

    public override int AnotherTransform(int a, int b)
    {
       return a * b;
    }
 }

这两种情况都有可能

对于可选的可重写方法,将基类方法声明为虚方法,并在子类中重写

对于必须由子类提供实现的方法,请将该类和方法标记为抽象

您不必重写子类中的虚拟方法,因此实现是继承的,除非您明确决定重写

例如:

 interface IInterface
 {
     int Transform(int a, int b);
     int AnotherTransform(int a, int b);
 }

 abstract class A : IInterface
 {
    public virtual int Transform(int a, int b)
    {
        return a + b;
    }

    public abstract int AnotherTransform(int a, int b);
 }

 class B : A
 {
    public override int Transform(int a, int b)
    {
        return a - b;
    }

    public override int AnotherTransform(int a, int b)
    {
       return a * b;
    }
 }
您可以将方法标记为IsValidRowas abstract:

您可以将方法标记为IsValidRowas abstract:


我有一个解决方案是使用接口隔离原则。这意味着要声明两个接口。第一个接口有一个IsFileValid方法,第二个接口实现第一个接口,还有一个IsFileValid方法,如下所示

  Interface A { void IsFileValid(); }
  Interface B : A { void IsValidRow();}
基类实现接口A,所有派生类实现接口B,如下所示

public class Base : A
{
      void IsFileValid(){ // immplementaion details}
}

public class Child : Base, B
{
      void IsValidRow(){// immplementaion details}    
}

快乐编码

我有一个解决方案,就是使用接口隔离原则。这意味着要声明两个接口。第一个接口有一个IsFileValid方法,第二个接口实现第一个接口,还有一个IsFileValid方法,如下所示

  Interface A { void IsFileValid(); }
  Interface B : A { void IsValidRow();}
基类实现接口A,所有派生类实现接口B,如下所示

public class Base : A
{
      void IsFileValid(){ // immplementaion details}
}

public class Child : Base, B
{
      void IsValidRow(){// immplementaion details}    
}

快乐编码

如果B声明为抽象,我认为它不必为所有方法提供实现,即使它们来自接口。如果B声明为抽象,我认为它不必为所有方法提供实现,即使它们来自接口。OP似乎也需要将类/方法抽象化,您可能还需要添加该信息。他不确定是否这样做,因为他没有明确指出B不能实例化;但是,他确实需要澄清IsValidRow,因为它读起来好像他说它必须在子类中实现,而不是选择性地实现。Mmm。对于类A,如果我不打算在转换中实现任何东西,我将只在类B中实现转换,该怎么办?我的意思是,我可以看到自己在基类虚方法中返回一些垃圾,并在所有derived@ygongdev如果你不能使用抽象基类,你可以把它设为虚拟的,并抛出一个“NotImplementedException”,你需要从基类调用isValidRow还是从子类调用isValidRow?看起来OP需要使类/方法抽象,您可能还需要添加该信息。不确定他是否这样做,因为他没有明确指出B不能是实例化的;但是,他确实需要澄清IsValidRow,因为它读起来好像他说它必须在子类中实现,而不是选择性地实现。Mmm。对于类A,如果我不打算在转换中实现任何东西,我将只在类B中实现转换,该怎么办?我的意思是,我可以看到自己在基类虚方法中返回一些垃圾,并在所有derived@ygongdev如果你不能使用抽象基类,你可以把它变成虚拟的,并抛出一个“NotImplementedException”,你需要从你的基类调用isValidRow还是仅仅从子类调用isValidRow?这并不能解决OP的问题问题是基类需要在自身上调用IsValidRow,但在子类中有实现。是的,你是对的,但我认为他说他只需要从子类调用IsValidRow。没有OP说明IsValidRow是从IsFileValid调用的,并且基类实现
ts IsFileValid和子类实现IsValidRowahh好的,所以您完全正确。非常感谢您的指出。这并不能解决OP的问题,因为基类本身需要调用IsValidRow,但在子类中有实现。是的,您是对的,但我认为他说他只需要从子类调用IsValidRow。没有OP说IsValidRow是从IsFileValid调用的,基类实现IsFileValid,子类实现IsValidRowahh好的,所以你完全正确。非常感谢你的指点。