簡體   English   中英

c#有沒有一種方法可以讓我的基類和派生類分別實現Interface方法?

[英]c# Is there a way that my base class and derived class can implement Interface methods separately?

我知道這個問題令人困惑,但是很難想到一個很好的標題來解決這個問題,因此我將在這里進行更多描述。

我有一個帶有2種方法的接口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
    }
 }

兩種情況都有可能。

對於可選的可重寫方法,將基類方法聲明為virtual並在子類中override

對於必須由子類提供實現的方法,請將類和方法標記為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}    
}

快樂編碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM