如何在已初始化的对象上定义方法?

时间:2014-05-29 08:17:05

标签: c# class methods

我的意思是,如果我定义了一个类

class Square
{
     public Square(int x, int y)
     {
     }
}

我做了。

Square s = new Square(5,5);
int a = s.Calc.Radios();

我如何处理Calc部分。

就像班上的一个班级一样。

4 个答案:

答案 0 :(得分:3)

您需要在类方块中声明calc

public calculator calc = new calculator();

然后你就可以使用s.calc.radios();

答案 1 :(得分:1)

声明一个单独的(或嵌套的)Calc类,并在该类的class square中创建一个属性calc。您可以通过私有集在square的构造函数中初始化该属性。

class Square
{
  public Calc Calc { get; private set;
  ...
  public Square()
  {
     this.Calc = new Calc();
  }
}

答案 2 :(得分:0)

在c#中,您无法向初始化对象添加属性。

c#是stronly typed,因此无法在运行时装饰对象,例如在某些弱类型语言中,例如JavaScript。


您可以使用扩展名方法扩展声明的对象。例如

public static class SomeStaticClass
{
    public Calc Calc(this Square square)
    {
        return new Clac(...
    }
}

您仅限于扩展方法,而不是属性。

只要引用中有SomeStaticClassSquare的实例就会有Calc方法返回Calc对象,无论是什么。


如果Square不是sealed,您可以继承来制作具有Square属性的新类型Calc,例如

public class SqaureWithCalc : Square
{
    public SquareWithCalc(int x, int y) : base(x, y)
    {
    }

    public Calc Calc { get; set; }
}

所以你可以做到,

var s = new SquareWithCalc(5, 5);

或者,最简单的是,因为你控制代码,你可以编辑它。在线之间阅读,也许你想要类似的东西,

public struct Square
{
    private readonly int x;
    private readonly int y;

    public Square(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public int X
    {
        get
        {
            return this.x;
        }
    }

    public int Y
    {
        get
        {
            return this.y;
        }
    }

    public static IEnumerable<Radio> CalculateRadios(Square square)
    {
        // Do stuff,
            //// yield return radio; 
        // in a loop.
    }

    public IEnumerable<Radio> CalculateRadios()
    {
        return CalculateRadios(this);
    }
}

答案 3 :(得分:0)

您只需将Calc设为Square类的属性即可。

另一个评论是,我可能会按照以下方式设计它:

square.PerformSomeCalcMethod();

其中

public void PerformSomeCalcMethod()
{
   // Use internal calc object.
}

这将允许您更改此方法的内部工作方式,而无需更改任何耦合到Calc属性的客户端。

查看Law of Demeter