Действительно ли возможно присвоить объект базового класса ссылке производного класса с явным преобразованием типа?

Вы можете использовать функцию createGraphics() для создания внеэкранного буфера. Затем вы можете нарисовать его на экране с помощью функции image() или вызвать функцию save() для сохранения его в виде файла. Вот пример:

let pg;

function setup() {
  createCanvas(400, 400);
  pg = createGraphics(4000, 4000);
  pg.background(32);
}

function draw() {
  pg.ellipse(random(pg.width), random(pg.height), 100, 100);
  image(pg, 0, 0, width, height);
}

function mousePressed(){
 pg.save("pg.png"); 
}
73
задан Bassie 27 April 2018 в 00:42
поделиться

6 ответов

No. A reference to a derived class must actually refer to an instance of the derived class (or null). Otherwise how would you expect it to behave?

For example:

object o = new object();
string s = (string) o;
int i = s.Length; // What can this sensibly do?

If you want to be able to convert an instance of the base type to the derived type, I suggest you write a method to create an appropriate derived type instance. Or look at your inheritance tree again and try to redesign so that you don't need to do this in the first place.

88
ответ дан Jon Skeet 24 November 2019 в 12:12
поделиться

Нет, см. Этот вопрос, который я задал - Обновление в .NET с использованием обобщений

Лучший способ состоит в том, чтобы создать конструктор по умолчанию для класса, создать и затем вызвать метод Initialise

-1
ответ дан Community 24 November 2019 в 12:12
поделиться

Расширение ответа @ ybo - это невозможно, потому что экземпляр вашего базового класса на самом деле не является экземпляр производного класса. Он знает только о членах базового класса и ничего не знает о членах производного класса.

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

3
ответ дан Andy 24 November 2019 в 12:12
поделиться

Нет, это невозможно, поэтому ваша ошибка во время выполнения.

Но вы можете назначить экземпляр производного класса к переменной типа базового класса.

5
ответ дан ybo 24 November 2019 в 12:12
поделиться

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

После создания тип объекта не может быть изменен (не в последнюю очередь, это может не быть одинакового размера). Однако вы можете преобразовать экземпляр, создав новый экземпляр второго типа - но вам нужно написать код преобразования вручную.

3
ответ дан Marc Gravell 24 November 2019 в 12:12
поделиться

Нет, это невозможно, поскольку присвоить его ссылке на производный класс все равно, что сказать: «Базовый класс является полностью способным заменяя производный класс, он может делать все, что может делать производный класс ", что неверно, поскольку производные классы в целом предлагают больше функциональных возможностей, чем их базовый класс (по крайней мере, такова идея наследования).

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

Что-то вроде этого:

public class Base {
    public int Data;

    public void DoStuff() {
        // Do stuff with data
    }
}

public class Derived : Base {
    public int OtherData;

    public Derived(Base b) {
        this.Data = b.Data;
        OtherData = 0; // default value
    }

    public void DoOtherStuff() {
        // Do some other stuff
    }
}

В этом случае вы должны скопировать базовый объект и получить полностью функциональный объект производного класса со значениями по умолчанию для производных членов. , Таким образом, вы также можете избежать проблемы, указанной Джоном Скитом:

Base b = new Base();//base class
Derived d = new Derived();//derived class

b.DoStuff();    // OK
d.DoStuff();    // Also OK
b.DoOtherStuff();    // Won't work!
d.DoOtherStuff();    // OK

d = new Derived(b);  // Copy construct a Derived with values of b
d.DoOtherStuff();    // Now works!
41
ответ дан APP 24 November 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: