不同子类的相同方法

时间:2019-07-30 15:52:12

标签: c# generics subclass

我有一个C#Point,其中有两个子类ColorPointAmountPoint

点级

public class Point
{
    double x; // Position x
    double y; // Position y

    public Point(double pos_x, double pos_y) // Constructor
    {
        this.x = pos_x;
        this.y = pos_y;
    }
}

public class ColorPoint : Point
{
    double color; // White value (0 to 255)
}

public class AmountPoint : Point
{
    int amount; // Amount of Persons standing at this point
}

现在我想要两件事。

  1. 我想有一个AdaptMeshPoints同时接受ColorPointAmountPoint输入列表的方法,并且我可以更改这两个参数的公用参数({ {1}})

  2. 我想告诉方法Point,应该打印出子类的哪个参数。

这应该看起来像这样:

AdaptMeshPoints

2 个答案:

答案 0 :(得分:4)

即使您的问题同时标有C#和Java,我还是从问题中的文本中假定这是C#。

要设置pointList[0].x,您需要告诉编译器T始终是Point(或继承自where T : Point)。使用通用类型约束(public main() { List<ColorPoint> colorList = new List<ColorPoint>(4); AdaptMeshPoints(colorList, x => x.color.ToString()); } public List<T> AdaptMeshPoints<T>(List<T> pointList, Func<T, string> whatToPrint) where T : Point { pointList[0].x = 45; Console.WriteLine(whatToPrint(pointList[0])); } )。

您还可以传递一个委托来描述您要打印的属性:

    SELECT 
    p.first_name, p.last_name, COUNT(r.movie_id) as working_number
FROM
    person p
          LEFT JOIN
    roles r ON r.person_id = p.id
WHERE
    r.movie_id IN (SELECT 
            r.movie_id
        FROM
            roles r
        WHERE
            role_type = 'Director'
                AND person_id = (SELECT 
                    id
                FROM
                    person
                WHERE
                    first_name = 'Quentin'
                        AND last_name = 'Tarantino'))
                        and r.role_Type = "Actor"
GROUP BY p.id;

答案 1 :(得分:1)

要1。创建一个使用Point []的函数。如果“不存在数据丢失的危险”并且适用于这种多态情况,则自动进行转换。

(我不确定这是多态的还是属于协方差和相反方差的区域,我不确定100%。但是这里的规则有意地非常相似)。

至2。这至少可以通过以下方式解决:

  • 一个额外的参数和一个开关/案例块
  • 处理包含实际代码的变量anotehr函数或接口以访问变量
  • 将代码交给Lambda或匿名函数来完成实际工作。

所以您必须“选择自己的位置”。