c#我的基类和派生类是否可以单独实现接口方法?

时间:2016-07-08 14:51:03

标签: c# class inheritance

我知道这个问题令人困惑,但很难想到这个问题的好标题,所以我会在这里详细说明。

我有一个包含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
    }
 }

3 个答案:

答案 0 :(得分:4)

这两种情况都有可能。

对于可选的可覆盖方法,在子类中将基类方法声明为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;
    }
 }

答案 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

快乐编码