Я не знаю, является ли прыжок лучшим словом для обозначения того, чего я хочу достичь (потому что я никогда не учился программированию официально), в основном у меня есть класс с двумя внутренними классами, вот код

using System.Drawing;

namespace Leveltar_Fresh
{
   class Scene
   {
      private Image image;

      public class Sphere : Scene
      {
          public Sphere()
          {
            
          }

          public Sphere addClickable(int x, int y, int r)
          {
             Clickable clickable = new Clickable.Sphere(x, y, r);
             return this;
          }
      }

      public class Rectangle : Scene
      {
         public Rectangle()
         {

         }

         public Rectangle addClickable(int x, int y, int width, int height)
         {
            Clickable clickable = new Clickable.Rectangle(x, y, width, height);
            return this;
         }
      }

      public static Scene createNewScene(Scene scene)
      {
         return scene;
      }
   }
}

Я попытался добавить метод во внешний класс, который я могу использовать в качестве другой цепочки для моей цепочки методов этого метода

public static Scene getScene()
{
   return this;
}

Но когда я вызвал этот метод в цепочке, я не смог получить доступ к внутренним классам, которые я сделал new Scene.Sphere().addClickable(20, 20, 50).getScene(), а затем я не смог вызвать ни один из внутренних классов, у меня больше опыта работы с java, и я знаю, что есть некоторые различия между использование внутренних классов в C # и java, но что вызывает это и как я могу это исправить?

-1
Règles Les 1 Сен 2020 в 23:29

2 ответа

Лучший ответ

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

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

Ниже я попытался сохранить вашу функциональность и просто сделать ваш код более плавным .

public class Scene
{
    public Scene()
    {
         ChildSphere = new Sphere();
         ChildRectangle = new Rectangle();
    }

    // 2 previously nested classes are now public properties.
    public Sphere ChildSphere { get; }
    public Rectangle ChildRectangle { get; }

    public static Scene CreateNewScene(Scene scene)
    {
        //logic...
        return scene;
    }

    public Scene GetScene()
    {
        return this;
    }
}

public class Sphere : Scene
{
    public Sphere AddClickable(int x, int y, int r)
    {
        Clickable clickable = new Clickable.Sphere(x, y, r);
        // logic..
        return this;
    }
}

public class Rectangle : Scene
{
    public Rectangle AddClickable(int x, int y, int width, int height)
    {
        Clickable clickable = new Clickable.Rectangle(x, y, width, height);
        // logic..
        return this;
    }
}

Что приводит к этому:

new Scene().ChildSphere
.AddClickable(20, 20, 50)
.GetScene()
.ChildRectangle
.AddClickable(20,40,60,80)
.GetScene();

Я включил метод GetScene() только потому, что он был у вас в вашем примере. Я не думаю, что это принесет много пользы, учитывая предоставленный вами код.

В приведенном выше примере есть кое-что, на что следует обратить внимание: как только вы вызываете этот new Scene().ChildSphere, у вас больше не будет доступа (через цепочку) к исходной (самой первой) сцене. Другими словами, каждая дополнительная цепочка будет возвращать текущий экземпляр в этой точке.

Итак, с точки зрения объектов, возвращаемых после каждой цепочки, мы имеем:

new Scene().ChildSphere     // scene1 -> scene1.ChildSphere
.AddClickable(20, 20, 50)   // scene1.ChildSphere
.GetScene()                 // scene1.ChildSphere
.ChildRectangle             // scene1.ChildSphere.ChildRectangle
.AddClickable(20,40,60,80)  // scene1.ChildSphere.ChildRectangle
.GetScene();                // scene1.ChildSphere.ChildRectangle

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

0
t.karalis 2 Сен 2020 в 06:53

Сложно сказать, что вы здесь пытаетесь сделать. Может как то так?

public interface IScene
{
    bool PointIsWithinScene( int x, int y);
} 

public Sphere: IScene
{
    public Sphere( int x, int y, int r) { ... }
    
    public bool PointIsWithinScene( int x, int y) { return ...; }
}

public Rectangle: IScene
{
    public Rectangle( int x, int y, int w, int h) { ... }

    public bool PointIsWithinScene( int x, int y) { return ...; }
}

public CompositeScene: List<IScene>, IScene
{
    public CompositeScene(): base() { ... }

    public bool PointIsWithinScene( int x, int y) 
    {
        return this.Any( subScene => subScene.PointIsWithinScene( x, y));
    }
}
0
sjb-sjb 2 Сен 2020 в 01:50