Информация об изменениях

Сообщение Re[12]: Базовое отличие ООП от ФП от 25.05.2024 3:10

Изменено 25.05.2024 4:56 Sinclair

Re[12]: Базовое отличие ООП от ФП
Здравствуйте, Serginio1, Вы писали:
S>>> А что мешает это присобачить к структурам?
S>>Отсутствие у них VMT.
S> Еще раз наследование для структур это не VMT это наследование полей свойств и методов.
S>Это наследование без виртуальных методов. Для структур это запрещено!
Какой сценарий в прикладном коде выиграет от наследования с такими ограничениями?
Наследование ценно там, где экземпляр субтипа может выступать в качестве супертипа.
А в нашем случае что?
Вот у нас
public struct Name
{
  public Name: string;
}

public class Person
{
  public Name: Name;
}

А теперь мы хотим применить наследование:
public struct FullName: Name
{
  // Name: string is inherited
  public LastName: string;
}

... 
var p = new Person();
p.Name = new FullName {Name = "John", FullName = "Doe"}

Что будет происходить? Молчаливое урезание FullName до Name? Ошибка компиляции?
Единственное место, где FullName можно безопасно использовать вместо Name — это ref Name аргумент в какую-нибудь функцию. Ну, или в ref-поле ref-структуры — то есть, опять же, конструкции, которая может жить исключительно на стеке.
Re[12]: Базовое отличие ООП от ФП
Здравствуйте, Serginio1, Вы писали:
S>>> А что мешает это присобачить к структурам?
S>>Отсутствие у них VMT.
S> Еще раз наследование для структур это не VMT это наследование полей свойств и методов.
S>Это наследование без виртуальных методов. Для структур это запрещено!
Какой сценарий в прикладном коде выиграет от наследования с такими ограничениями?
Наследование ценно там, где экземпляр субтипа может выступать в качестве супертипа.
А в нашем случае что?
Вот у нас
public struct Name
{
  public Name: string;
}

public class Person
{
  public Name: Name;
}

А теперь мы хотим применить наследование:
public struct FullName: Name
{
  // Name: string is inherited
  public LastName: string;
}

... 
var p = new Person();
p.Name = new FullName {Name = "John", FullName = "Doe"}

Что будет происходить? Молчаливое урезание FullName до Name? Ошибка компиляции?
Единственное место, где FullName можно относительно безопасно использовать вместо Name — это ref Name аргумент в какую-нибудь функцию. Ну, или в ref-поле ref-структуры — то есть, опять же, конструкции, которая может жить исключительно на стеке.
И то, непонятно, как GC будет отслеживать ссылки — ему ведь нужно как-то понимать, что в данном экземпляре Person через Name.LastName прикопана ссылка на строку.