Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 C#处理派生类型、重构_C# 4.0_Refactoring - Fatal编程技术网

C# 4.0 C#处理派生类型、重构

C# 4.0 C#处理派生类型、重构,c#-4.0,refactoring,C# 4.0,Refactoring,我使用的是第三部分.NET库,它包含以下类 形状(抽象基类) (以下所有类别均源自他) 长方形 圈 三角 所有这些类都有一个名为Area的属性 我正在遍历一组形状,并设置区域 注:面积不是形状的属性,而是每个类的属性 因此,我的代码如下所示: if (shapeVar is Reactangle) { (shapeVar as Rectangle).area = value; } if (shapeVar is Circle) { (shapeVar as Circle).area

我使用的是第三部分.NET库,它包含以下类

形状(抽象基类)

(以下所有类别均源自他)

长方形

三角

所有这些类都有一个名为Area的属性

我正在遍历一组形状,并设置区域

注:面积不是形状的属性,而是每个类的属性

因此,我的代码如下所示:

if (shapeVar is Reactangle)
{
   (shapeVar as Rectangle).area = value;
}

if (shapeVar is Circle)
{
   (shapeVar as Circle).area = value;
}

if (shapeVar is Triangle)
{
   (shapeVar as Triangle).area = value;
}
有更好的方法吗? 我觉得这很愚蠢,但我没有找到其他方法


我使用的是.NET 4

您可以使用反射来访问每个形状的面积属性,尽管性能成本很低:

shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null);

您可以使用反射来访问每个形状的面积属性,但性能成本很低:

shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null);

为什么不让Area成为从派生类型返回的方法而不是被设置的方法呢

public abstract class Shape
{
    abstract public double Area();
}

public class Square : Shape
{
    double sideLength;
    public double Area
    {
        return sideLength * sideLength;
    }
}

public class Circle : Shape
{
    double radius;
    public double Area
    {
        return Pi * r * r;
    }
}
如果要继续设置区域,可以将区域移动到基类中:

public abstract class Shape
{
    public double Area;
}

public class Square : Shape
{
    ...
}
您可以查看基于派生类型设置区域的形状,您可以执行以下操作:

foreach (Shape shape in shapes)
    switch(typeof(shape))
    {
        case typeof(Square))
        {
            shape.Area = value; //I imagine this is derived type specific
            ...
        }
    }

为什么不让Area成为从派生类型返回的方法而不是被设置的方法呢

public abstract class Shape
{
    abstract public double Area();
}

public class Square : Shape
{
    double sideLength;
    public double Area
    {
        return sideLength * sideLength;
    }
}

public class Circle : Shape
{
    double radius;
    public double Area
    {
        return Pi * r * r;
    }
}
如果要继续设置区域,可以将区域移动到基类中:

public abstract class Shape
{
    public double Area;
}

public class Square : Shape
{
    ...
}
您可以查看基于派生类型设置区域的形状,您可以执行以下操作:

foreach (Shape shape in shapes)
    switch(typeof(shape))
    {
        case typeof(Square))
        {
            shape.Area = value; //I imagine this is derived type specific
            ...
        }
    }

您可以包装矩形、圆形和三角形类(来自第三方程序集),并在自己的代码中创建3个新类

然后,您可以有一个接口,例如:

        public interface IShape
        {
            double Area{get;set;}
        }
创建包装类以实现此公共接口


之后,您可以在代码中以通用方式使用这三个类,而不必知道它们的实际具体类是什么。(通过引用接口类型而不是形状基类型)

您可以包装矩形、圆形和三角形类(来自第三方程序集)并在自己的代码中创建3个新类

然后,您可以有一个接口,例如:

        public interface IShape
        {
            double Area{get;set;}
        }
创建包装类以实现此公共接口


之后,您可以在代码中以通用方式使用这三个类,而不必知道它们的实际具体类是什么。(通过引用接口类型而不是形状基类型)

作者已经提到所有这些类都来自第三方库。作者已经提到所有这些类都来自第三方库。感谢您的回答。我最终保持了代码的原样。我不想用ReflectionTanks作为答案。我最终保持了代码的原样。我不想使用反射