繁体   English   中英

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

[英]c#, force method implementation in child class

我有这个设置:

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");
    }
}

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

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

如果我正确理解了这个问题,则您在基类中有一些默认行为,并且需要强制在派生类中实现一些逻辑,则可以使用控制反转原理和模板方法设计模式,您必须制作另一个内部方法,例如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()
    {

    }
}

创建两个界面 一个用于基类,另一个用于子类。 并在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");
    }
}

使用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");
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM