c#,子类中的强制方法实现

时间:2019-02-15 19:39:29

标签: c# class inheritance interface

我有此设置:

public class BaseElement
{
    public BaseElement() { }
    public virtual void method01()
    {
        Console.WriteLine("class BaseElement method01");
    }
}
public class Element01 : BaseElement
{
    public Element01() { }
    public override void method01()
    {
        Console.WriteLine("class Element01 method01");
    }
}
public class Element02 : BaseElement
{
    public Element02() { }
    public override void method01()
    {
        Console.WriteLine("class Element02 method01");
    }
}

现在,我想强制Class01 / Element02 / Element03等类来实现method01。 我认为正确的方法是使用接口。 但是由于Element01 / Element02 / Element03等继承自BaseElement,因此无需在Element01 / Element02 / Element03等中实现method01,因为它已在BaseElement中实现。但是我想强制Element01 / Element02 / Element03等在每个这些类中实现特定的method01。另一方面,我还需要BaseElement中的method01来处理Element01 / Element02 / Element03等,以作为BaseElement。 最好的方法是什么?

(与抽象和虚函数之间的区别无关。我需要接口或抽象类的特定安排。)

3 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,则您在基类中具有一些默认行为,并且您需要强制在派生类中实现一些逻辑,则可以使用“控制反转”原理,Template method Design pattern您必须制作另一个内部方法,例如method01Int,它将是抽象的,所有派生类都应实现它,例如:

 public abstract class BaseElement
{
    public BaseElement() { }
    public  void method01()
    {
        Console.WriteLine("class BaseElement method01");
        method01Int();
    }

    protected abstract void method01Int();
}
public class Element01 : BaseElement
{
    public Element01() { }
    protected override void method01Int()
    {
        Console.WriteLine("class Element01 method01");
    }
}
public class Element02 : BaseElement
{
    public Element02() { }
    protected override void method01Int()
    {
        Console.WriteLine("class Element02 method01");
    }
}

即使在派生类中没有某些逻辑,您也可以像这样实现

    public class Element03 : BaseElement
{
    public Element03() { }
    protected override void method01Int()
    {

    }
}

答案 1 :(得分:0)

创建两个界面。一个用于基类,另一个用于子类。并在 BaseElement 类中明确实现 method01()。希望对您有所帮助。

class Program
{
    static void Main(string[] args)
    {
        IBase obj = new BaseElement();
        IElement obj1 = new Element01();
        obj.method01();//call base
        obj1.method01();

        Console.ReadLine();
    }
}
public interface IBase
{
    void method01();
}
public interface IElement
{
    void method01();
}
public class BaseElement : IBase
{
    public BaseElement() { }
    void IBase.method01()
    {
        Console.WriteLine("class BaseElement method01");
    }
}
public class Element01 : BaseElement, IElement
{
    public Element01() { }
    public void method01()
    {
        Console.WriteLine("class Element02 method01");
    }

}
public class Element02 : BaseElement, IElement
{
    public Element02() { }
    public void method01()
    {
        Console.WriteLine("class Element02 method01");
    }
}

答案 2 :(得分:0)

使用MiddleElement:

public class BaseElement
{
    public BaseElement() { }
    public virtual void method01()
    {
        Console.WriteLine("class BaseElement method01");
    }
}
public abstract class MiddleElement: BaseElement
{
    public abstract override void method01();
};

public class Element01 : MiddleElement
{
    public Element01() { }
    public override void method01()
    {
        Console.WriteLine("class Element02 method01");
    }
}
public class Element02 : MiddleElement
{
    public Element02() { }
    public override void method01()
    {
        Console.WriteLine("class Element02 method01");
    }
}

话虽如此,我想了解您为什么有这些要求。可能有一种更简单的方法。