功能和密封问题

时间:2017-07-13 22:53:57

标签: c#

我必须使用一个库,它有许多不同形状的类。我必须使用它们来做各种功能。

例如,我有一个class Circle,它只公开一个方法`double Calculate(Func)'。我读了关于Func,Action,代表但不知怎的,我不完全确定。我试过了:

var circle = new Circle(10);
circle.Calculate(radius * 2 * 3.14);

但它不起作用。 然后我尝试创建一个新类MyCircle并继承Circle来实现一些功能,但是我收到了一个错误:

  

' MyCircle'不能从密封的班级继承' Circle'

我该怎么办?

3 个答案:

答案 0 :(得分:1)

可能这个类定义如下:

public sealed class Circle 
{
    private double radius;

    public Circle(double r)
    {
        radius = r;
    }

    public double Calculate(Func<double, double> operation) 
    {   
        return operation(radius);
    }
}

由于它是sealed,你无法继承它。 此外,radius是对象的私有字段,因此您无权访问它。 这意味着您需要通过向Calculate提供Func来使用var circle = new Circle(10); circle.Calculate(r => 2 * Math.PI * r); 方法。如果您不知道Func是什么,它是预定义的委托。像C中的函数指针,但类型安全。

这是你计算周长的方法:

Func<double,double>

你可以继续计算面积;)

答案 1 :(得分:1)

circle.Calculate(radius => radius * 2.0 * 3.14)表示一个带双精度并返回双精度的函数

所以你想要一个看起来像double Circumference(double radius) { return radius * 2.0 * 3.14 }

的lambda

或者你可以有一个方法

circle.Calculate(Circumference)

然后

h1

答案 2 :(得分:1)

<h1  class="text-primary">Request Service</h1>

  <?php
   echo "<div class='input-group'>";

   class TableRows extends RecursiveIteratorIterator { 
    function __construct($it) { 
    parent::__construct($it, self::LEAVES_ONLY); 
    }

    function current() {
    return "<span class='input-group-addon'>
    <input type='submit' aria-label='...' value='Request'>
        </span><input type='text' disabled class='form-control' aria-
            label='...' value='" . parent::current(). "'>";
    }

    function beginChildren() { 
    echo ""; 
     } 

    function endChildren() { 
    echo "" . "\n";
    } 
   } 

   $servername = "localhost";
   $username = "root";
   $password = "";
   $dbname = "crb";

   try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, 
    $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT SERVICE_NAME FROM services"); 
    $stmt->execute();

    // set the resulting array to associative
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

    foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as 
      $k=>$v) { 
    echo $v;
    }
}
   catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
   }
   $conn = null;
   echo "  </div> ";
?> 

根据此签名,该函数需要double Calculate(Func<double, double>) 。这是一个函数,它接受Func<double, double>类型的单个参数并返回double。如下所示:

double

然后您可以将该方法传递给函数:

double GetCircleCircumference(double radius)
{
    return radius * 3.14 * 2;
}

您还可以传入 lambda函数,这样可以免于首先定义该方法:

circle.Calculate(GetCircleCircumference);

当然,这是否会产生任何有用的结果取决于circle.Calculate(radius => radius * 3.14 * 2); 实际上在做什么。也许文档会帮助你(我个人认为“计算”是一个方法的可怕名称 - 计算什么?!)。

至于你得到的错误信息,“&#39; MyCircle&#39;不能继承密封的班级&#39;“,这意味着Calculate被创建为一个密封的类,如下所示:

Circle

这意味着该类的作者对继承进行了“封锁”。所以你不能继承它;你故意不能成为它的子类。如果您想扩展行为,则必须使用不同的方法,例如使用合成。