c #, реализация метода force в дочернем классе - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть этот параметр:

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, нет необходимости реализовывать метод 01 в Element01 / Element02 / Element03 и т. Д., Поскольку он уже реализован в BaseElement.Но я хочу заставить Element01 / Element02 / Element03 и так далее реализовать определенный метод01 в каждом из этих классов.С другой стороны, мне нужно, чтобы method01 в BaseElement также обращался к Element01 / Element02 / Element03 и т. Д. Как BaseElement.Каков наилучший способ сделать это?

(Это никак не связано с различием между абстрактными и виртуальными функциями. Мне нужно конкретное расположение интерфейса или абстрактного класса.)

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Создать два интерфейса .Один для базового класса, а другой для подклассов.И реализовать method01 () явно в BaseElement классе.Надеюсь, это поможет.

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");
    }
}
0 голосов
/ 15 февраля 2019

Используйте 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");
    }
}

При этом я хотел бы понять, почему у вас есть эти требования.Там может быть более простой подход.

0 голосов
/ 15 февраля 2019

Если я правильно понимаю вопрос, у вас есть поведение по умолчанию в базовом классе, и вам нужно принудительно реализовать некоторую логику в производном классе, вы можете использовать принцип инверсии управления и шаблонный метод 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()
    {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...