Как определить аксессуары для детей? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть 3 класса:

public interface IParent
{
    String World { get; }
}

public class Parent : IParent
{
    public String World;
    {
        get
        {
            return "Hello " + this.World;
        }
    }
}

public class Children : Parent
{
    public String World = "World";
}

Как мне сделать так, чтобы метод доступа get из Parent вызывался с атрибутом World из Children?

Ответы [ 4 ]

0 голосов
/ 07 ноября 2018

Вы можете использовать второе свойство для суффикса и сделать его виртуальным, чтобы потомки могли его перезаписать

public class Parent : IParent
{
    protected virtual string Suffix => "World";

    public String World => "Hello " + Suffix;
}

public class Children : Parent
{
    protected override string Suffix => "Again";
}

Родители отобразят «Hello World», Дети - «Hello Again». Это верно только для типа времени выполнения. Статический тип (то есть время компиляции) не имеет значения.

Parent p = new Children();
Console.WriteLine(p.World); // Displays "Hello Again"!

Здесь статический тип p равен Parent. Тип времени выполнения: Children. Это поведение называется Полиморфизм (Руководство по программированию в C #) .

Настоящий Parent не может узнать о суффиксе «Снова».

0 голосов
/ 07 ноября 2018

Свойство уже является частью родительского объекта. Однако вам понадобится функция защищенного набора ... Установите ее в конструкторе следующим образом:

public interface IParent
{
    String World { get; }
}

public class Parent : IParent
{
    public String World { get; protected set; }
    public Parent() { World = "Hello World"; }
}

public class Children : Parent
{
    public Children() { World = "World"; }
}

Однако, возможно, вы ищете что-то похожее на это:

public interface IParent
{
    String World { get; }
}

public class Parent : IParent
{
    public String World { get; private set; }
    public Parent(String thing) { World = "Hello " + thing; }
}

public class Children : Parent
{
    public Children() : base("World") { }
}
0 голосов
/ 07 ноября 2018

Вы можете использовать дополнительное закрытое поле, которое будет виртуальным, поэтому вы можете переопределить его в дочернем элементе.

Попробуйте это:

public interface IParent
{
    string HelloWorld { get; }
}

public class Parent : IParent
{
    protected virtual string World { get; }

    public string HelloWorld
    {
        get
        {
            return "Hello " + World;
        }
    }
}

public class Children : Parent
{
    protected override string World { get; } = "World";
}

Или вы можете также передать строку через конструктор, а затем установить значение во время выполнения.

public interface IParent
{
    string HelloWorld { get; }
}

public class Parent : IParent
{
    private readonly string world;

    public Parent(string world)
    {
        this.world = world;
    }

    public string HelloWorld
    {
        get
        {
            return "Hello " + world;
        }
    }
}

public class Children : Parent
{
    public Children(string world) : base(world)
    {
    }
}

Используйте это так:

var children = new Children("World");
Console.WriteLine(children.HelloWorld);
0 голосов
/ 07 ноября 2018

Это задом наперед.

Дело в том, что наследующий класс должен включать поведение базового класса из переопределений , если требуется . Подкласс override является базовым поведением, но имеет привязку к базовому классу через ключевое слово base.

Как таковой:

public interface IParent
{
    String World { get; }
}

public class Parent : IParent
{
    public virtual String World
    {
        get
        {
            return "Hello";
        }
    }
}

public class Children : Parent
{
    public override String World
    {
        get
        {
            return base.World + " World!";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...