如果按照以下代码进行操作
class A;
int a = 10;
endclass
class B extends A;
int b = 20;
endclass
program test;
A a1;
B b1;
initial begin
b1 = new();
a1 = b1; //child class object is assigned to parent class handle
$display("Value of variable b is %x", a1.b);
end
endprogram
然后上面的代码导致错误,"找不到会员' b'在课堂上' A'"& 现在我的观察是,当扩展类对象被分配给基类句柄时,模拟器将检查句柄的类型并检查该类中是否存在变量。由于变量b未在基类中定义,因此会导致错误 所以我想确认我的上述观察结果是正确还是不正确? 如果有人想在我的观察中添加一些东西,我会欢迎,如果它是正确的。
由于
答案 0 :(得分:2)
你是对的,这是我所知道的OOP语言中的预期行为(我不是特别知道你正在使用的那个,但你的例子很简单)。能够使用子类声明的变量会导致违反polymorphism(或子类型)的面向对象原则。
我将用Java回答你,因为我确信这个语言的语法对于我想要给出的例子。想象一下具有相同声明类型的两个变量:
public A buildA () {
return new B();
}
public static void main () {
A a1 = new A();
A b1 = buildA();
}
多态性原则是a1
和b1
应该实现相同的接口并且无差别地使用。如果我被允许访问变量的成员b
,因为编译器无法猜测哪个是基数,哪个是子进程,那么每次访问具体的{{1}时,它都会允许程序在运行时崩溃,删除应该提供的安全网类型。
答案 1 :(得分:1)
我不会在这里使用术语父和子类。它意味着您有两个单独的类对象。
您描述的是两个不同的类类型,其中一个类型是从基类型派生/扩展的。然后,您声明两个类变量:<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
if(mysqli_connect_errno())
{
echo mysqli_connect_error();
}
$loggedInUserId = $_SESSION['user_id'];
$resu = mysql_query("SELECT pid FROM users WHERE id='$loggedInUserId';");
$ro = mysql_fetch_row($resu);
$sql= "SELECT pid, project_name, image, image_type FROM project WHERE pid ='". $row["pid"]. "';";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_array()) {
//$type= "Content-type:".$row['image_type'];
//header ($type);
echo "<form action='respodents.php' method='post'><button name='submit' id='projectbutton'>
<div>
<img src=pic.php?pid=".$row['pid']." width=100px height=100px/>"." <div id='project_name'>".$row['project_name']."</div>"."
<input type='hidden' name='pid' value='".$row['pid']."'>
<input type='hidden' name='project_name' value='".$row['project_name']."'>
</div>
</button></form>";
}}
mysqli_close($mysqli);
?>
和a1
。这些变量可以将句柄保存到相同类型的类对象,或者对任何类型的对象的句柄扩展变量的类型。但是,编译器不允许引用任何未通过类变量类型定义的变量或成员,而不管类变量当前持有句柄的对象的类型。
OOP使您能够与类变量进行交互,并且可以使用它来处理更复杂的对象,而无需了解对该对象进行了哪些扩展。但是你必须假设该对象可以与类变量的类型相同。编译器也强制执行此操作。如果要与扩展类变量进行交互,则需要使用扩展类变量类型。