Как я могу передать ссылку на внутренний класс после строительства общедоступного подкласса, не нарушая безопасность NulC#

Место общения программистов C#
Ответить
Anonymous
 Как я могу передать ссылку на внутренний класс после строительства общедоступного подкласса, не нарушая безопасность Nul

Сообщение Anonymous »

Я не очень пережил с C#, и это немного головоломка. Рассмотрим следующий код: < /p>

Код: Выделить всё

#nullable enable
using System.Collections.Generic;

// Biology.dll

public abstract class Animal
{
public Animal() {}
}

public class Biome
{
private List animals = new();

public Biome() {}

public void AddAnimal(Animal a)
{
animals.Add(a);
}

public void Simulate() {}
}

// Program.exe

public class Dog : Animal {}
public class Centipede : Animal
{
private uint nLegs;

public Centipede(uint nLegs)
{
this.nLegs = nLegs;
}
}

public class Program
{
public static void Main()
{
Biome b = new();
b.AddAnimal(new Dog());
b.AddAnimal(new Centipede(100));
b.Simulate();
}
}
The important things about this are:
  • Different subclasses of Animal can have different constructor parameters, so I can't use a generic function in Biome to construct new Animal objects (because generics can only use zero-parameter constructors)
  • Объекты, по дизайну, не знают объекта Biome , который владеет им
  • Создание объектов Animal и регистрирует их с помощью Biome имеет чистый, интуитивно понятный синтаксис
Это все хорошо, и Dandy Some Dard, но и Let's Some's Als As Als's также. BIOME владеет именно одним объектом , и он делится этим, который возражает с каждым животным , чтобы гарантировать, что каждый работает из одной и той же информации о погоде. Тем не менее, погода не должна быть публичной конструктивной, это только для различных реализаций Animal для доступа в их функциях.
Ниже моя лучшая попытка до сих пор:

Код: Выделить всё

#nullable enable
using System.Collections.Generic;

// Biology.dll

public abstract class Animal
{
protected internal Biome.IWeather weather;

public Animal() {} // CS8618 - Non-nullable field 'weather' must contain a non-null value when exiting constructor.
}

public class Biome
{
public interface IWeather {}

private class Weather : IWeather
{
internal Weather() {}
}

private Weather weather = new();
private List animals = new();

public Biome() {}

public void AddAnimal(Animal a)
{
a.weather = weather;
animals.Add(a);
}

public void Simulate() {}
}

// Program.exe

public class Dog : Animal {}
public class Centipede : Animal
{
private uint nLegs;

public Centipede(uint nLegs)
{
this.nLegs = nLegs;
}
}

public class Program
{
public static void Main()
{
Biome b = new();
b.AddAnimal(new Dog());
b.AddAnimal(new Centipede(100));
b.Simulate();
}
}
Как вы можете видеть, проблема в том, что я должен полностью построить объект животного в программе. Концептуально, Animal.weather должен быть инициализирован во время создания объекта и регистрации его с помощью Biome , но поскольку я пересекаю границу доступности, он технически разделен на два шага. Animal объекты, которые не зарегистрированы в биоме , но я подозреваю, что это невозможно, поскольку Animal Подклассы должны иметь публичные конструкторы.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -public-fa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»