[英]C#: my derived class cannot override base class's interface method implementation, why?
[英]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.