我必须使用一个库,它有许多不同形状的类。我必须使用它们来做各种功能。
例如,我有一个class Circle
,它只公开一个方法`double Calculate(Func)'。我读了关于Func,Action,代表但不知怎的,我不完全确定。我试过了:
var circle = new Circle(10);
circle.Calculate(radius * 2 * 3.14);
但它不起作用。
然后我尝试创建一个新类MyCircle
并继承Circle来实现一些功能,但是我收到了一个错误:
' MyCircle'不能从密封的班级继承' Circle'
我该怎么办?
答案 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
}
或者你可以有一个方法
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
这意味着该类的作者对继承进行了“封锁”。所以你不能继承它;你故意不能成为它的子类。如果您想扩展行为,则必须使用不同的方法,例如使用合成。