我知道这个问题令人困惑,但很难想到这个问题的好标题,所以我会在这里详细说明。
我有一个包含2种方法的接口A,IsValidRow()
和IsFileValid()
我有一个基类B和一个派生类C.
这里的目标是我希望基类实现IsFileValid()
,因此它可以被从基类派生的所有类继承,并且每个派生类都可以实现IsValidRow()
。
问题是IsFileValid()
内部调用了IsValidRow()
。如果我做
B:A
A需要在B中实施IsValidRow()
。
目前,我的派生类C继承自基类和接口atm。
我不介意重构所有内容,只要满足2个方法的要求(一个将在基类中执行一次或者某些东西并继承,而另一个将在每个派生类中实现)< / p>
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
}
}
答案 0 :(得分:4)
这两种情况都有可能。
对于可选的可覆盖方法,在子类中将基类方法声明为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;
}
}
答案 1 :(得分:0)
您可以将方法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;
}
}
}
答案 2 :(得分:0)
我有一个解决方案是使用接口隔离原则。这意味着宣布两个<form action="dosomething.php" method="get">
<input name="types[]" value="<?php echo $_GET['types']; ?>" />
</form>
。第一个方法有一个方法interfaces
,第二个接口实现第一个接口,另一个方法是IsFileValid()
这样
IsFileValid()
和基类实现接口 Interface A { void IsFileValid(); }
Interface B : A { void IsValidRow();}
,所有派生类都像这样实现接口A
。
B
快乐编码