c# 有没有办法让我的基类和派生类分别实现接口方法

本文关键字:实现 方法 接口 派生 有没有 基类 我的 | 更新日期: 2023-09-27 17:56:06

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

我有一个接口 A,有 2 种方法,IsValidRow()IsFileValid()我有一个基类 B 和一个派生类 C这里的目标是我希望基类实现IsFileValid(),这样它就可以被从基类派生的所有类继承,每个派生类来实现IsValidRow()

问题是IsFileValid()打电话给IsValidRow()里面。如果我这样做

B:A

A 要求在 B 中实现IsValidRow()

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

只要

满足 2 种方法的要求,我不介意重组所有内容(一种将在基类或其他东西中实现一次并跨继承,而另一种将在每个派生类中实现)

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

c# 有没有办法让我的基类和派生类分别实现接口方法

这两种情况都有可能。

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

对于必须具有子类提供的实现的方法,请将类和方法标记为 abstract

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

例如:

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

您可以将方法IsValidRow()标记为abstract

namespace test
{
    interface A
    {
        bool IsFileValue();
        bool IsValidRow();
    }
    abstract class B : A
    {
        public bool IsFileValue()
        {
            return IsValidRow();
        }
        public abstract bool IsValidRow();
    }
    class C : B
    {
        public override bool IsValidRow()
        {
            return true;
        }
    }
}

我有一个解决方案是使用接口隔离原则。 这意味着声明两个interfaces。第一个有一个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}    
}

快乐编码