深入Atlas系列:Web Sevices Access in Atlas示例(3)
多态是OOP的重要特性,我这里指的多态是其中的一小部分。 在Web Services方法中,我们往往使用的都是一个具体类型的参数。这个参数一般就是一个数据对象,所有的功能基本上只是为了存放数据。虽然这对于应用来说一般已经足够,我们大量使用了这样的Web Servi
多态是OOP的重要特性,我这里指的多态是其中的一小部分。
在Web Services方法中,我们往往使用的都是一个具体类型的参数。这个参数一般就是一个数据对象,所有的功能基本上只是为了存放数据。虽然这对于应用来说一般已经足够,我们大量使用了这样的Web Services,不也过得好好的吗?但是,在这一点上实在太不够面向对象了。
不过,我们到底如何在Web Services方法中运用多态呢?似乎最容易想到的办法就是在Web Services方法里使用接口或者抽象类型的参数,只要将不同的实现或者子类对象作为参数传递给Web Services方法就可以了。作为示例,我们希望看到最简单的东西,那么就使用这个方法吧。
首先,我们定义一个Employee抽象类:
Employee抽象类1 public abstract class Employee<br>2 {<br>3 private int _Years;<br>4 public int Years<br>5 {<br>6 get<br>7 {<br>8 return this._Years;<br>9 }<br>10 set<br>11 {<br>12 this._Years = value;<br>13 }<br>14 }<br>15<br>16 public string RealStatus<br>17 {<br>18 get<br>19 {<br>20 return this.GetType().Name;<br>21 }<br>22 }<br>23<br>24 public abstract int CalculateSalary();<br>25 }
Employee抽象类存放了一个员工的工龄,RealStatus属性返回了当前实例真正的类名,并且定义了一个CalculateSalary方法,可以让子类提供不同的实现。
我们又写了一个Web Services方法CalculateSalary,用于计算一个员工的薪水,并将信息返回。代码如下:
CalculateSalary方法
1 [WebMethod]<br>2 public string CalculateSalary(Employee employee)<br>3 {<br>4 return "I'm " + employee.RealStatus + ", my salary is " + employee.CalculateSalary() + ".";<br>5 }
这样,我们只要传入不同的Employee子类的实例,就能获得不同的信息了。那么我们现在开始分配薪水吧(以下数据纯属虚构,如有雷同,实属巧合)!
首先是实习生。可怜的实习生,不管干多少年永远只有2000元:
Intern类代码
1 public class Intern : Employee<br>2 {<br>3 public override int CalculateSalary()<br>4 {<br>5 return 2000;<br>6 }<br>7 }
接下来是签第三方公司的合同工,底薪5000,每年增加1000:
Vendor类代码
1 public class Vendor : Employee<br>2 {<br>3 public override int CalculateSalary()<br>4 {<br>5 return 5000 + 1000 * (Years - 1);<br>6 }<br>7 }
最后是正式员工(全职工),底薪12000,每年增加2000:
FulltimeEmployee类代码
1 public class FulltimeEmployee : Employee<br>2 {<br>3 public override int CalculateSalary()<br>4 {<br>5 return 12000 + 2000 * (Years - 1);<br>6 }<br>7 }
然后我们应该如何告诉Atlas将不同类型的实例传递给Web Services方法的参数呢?答案便是使用“__serverType”指定类型。我们通过示例代码查看这一点:
首先我们还是来看简单的HTML代码:
HTML代码
1 <scriptmanager id="ScriptManager" runat="server"></scriptmanager><br>2 <br>3 <div>Years:<input type="text" id="txtYears">
</div>
<br>4 <div>
<br>5 Status:<br>6 <select id="comboStatus" style="width:150px;"><br>7 <option value="Jeffz.PolymorphismInWSTypes.Intern">Intern</option>
<br>8 <option value="Jeffz.PolymorphismInWSTypes.Vendor">Vendor</option>
<br>9 <option value="Jeffz.PolymorphismInWSTypes.FulltimeEmployee">FTE</option>
<br>10 </select><br>11 </div>
<br>12 <input type="button" onclick="calculateSalary()" value="Calculate!"><br>13 <h1 id="Result">Result:</h1>
<br>14 <div id="result"></div>
有一个文本框,在里面输入年份。还有一个下拉框,可以选择想要传递给Web Services方法的参数类型。点击“Calculate!”按钮则会调用Web Services方法,并将结果显示在最后的DIV上。
下面是所用到的Javascript代码:
Javascript代码
1 <script language="javascript"><BR>2 function calculateSalary()<BR>3 {<BR>4 var emp = new Object();<BR>5 emp.Years = parseInt($("txtYears").value, 10);<BR>6 emp.__serverType = $("comboStatus").value;<BR>7 <BR>8 Sys.Net.ServiceMethod.invoke(<BR>9 "EmployeeService.asmx",<BR>10 "CalculateSalary",<BR>11 null,<BR>12 { employee : emp },<BR>13 onComplete<BR>14 );<BR>15 }<BR>16 <BR>17 function onComplete(result)<BR>18 {<BR>19 $("result").innerHTML = result;<BR>20 }<BR>21 </script>
calculateSalary函数会构造一个Object作为Web Services方法的参数,设置它的“Years”之后,还会将下拉框选择的那项赋值给“__serverType”。这样,“__serverType”的值就是一个类的FullName了,于是也就告诉了Atlas在服务器端需要构造哪个类的实例
打开页面:
在文本框内填入工龄,选择Status,并点击“Calculate!”按钮。咦?怎么出错了?
为什么会出现这个错误?因为Atlas的服务器端Web Services运行环境没有在其上下文的字典里找到Jeffz.PolymorphismInWSTypes.Vendor这个类,于是抛出了KeyNotFoundException。那么我们该如何解决这个问题呢?这时候XmlIncludeAttribute就登场了,它原本是配合XmlSerializer使用,而现在也大有用武之地。
我们只需使用XmlIncludeAttribute为CalculateSalary这个Web Services方法作标记就可以了,例如:
应用了XmlIncludeAttribute的CalculateSalary方法
1 [XmlInclude(typeof(Intern))]<br>2 [XmlInclude(typeof(Vendor))]<br>3 [XmlInclude(typeof(FulltimeEmployee))]<br>4 [WebMethod]<br>5 public string CalculateSalary(Employee employee)<br>6 {<br>7 return "I'm " + employee.RealStatus + ", my salary is " + employee.CalculateSalary() + ".";<br>8 }
我们再运行一下页面,先选择Intern,输入工龄为2,点击“Calculate!”按钮:
再选择FTE,输入工龄为5,点击“Calculate!”按钮:
可以发现,我们在客户端告诉了Atlas应该使用哪个类,而Atlas也老老实实地构造了相应的类。如果能够合理地使用这一点,我们能够做的事情何止这个示例写的这么简单!
从这里我们可以看出,虽然Atlas打着“使用Web Services”的名号,但是它事实上使用一套特别的运行环境。如果利用好这个运行环境的特性,我们的Atlas开发生活会变得更加美好。:)
注一:如果一个Web Service类有多个Web Service方法,只需在一个方法上使用XmlInclude来标注类A,则所有该类的方法都能够使用类A,因为那些方法都在同一个Web Service上下文中。不过,不同的Web Services类使用了不同的上下文。
注二:对于Atlas有关这部分功能的实现方式以及代码分析感兴趣的朋友,可参考本人之前的文章《深入Atlas系列:Web Sevices Access in Atlas(6) - 对于复杂数据类型的支持(下)》,可能您会得到比我更深的理解。:)
本文作者:
핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. Windows 11에서 설정을 엽니다. Win+I 단축키나 다른 방법을 사용할 수 있습니다. 2. 앱 섹션으로 이동하여 앱 및 기능을 클릭합니다. 3. 백그라운드에서 실행되는 것을 방지하려는 애플리케이션을 찾으세요. 점 3개 버튼을 클릭하고 고급 옵션을 선택합니다. 4. [백그라운드 애플리케이션 권한] 섹션을 찾아 원하는 값을 선택하세요. 기본적으로 Windows 11은 전원 최적화 모드를 설정합니다. 이를 통해 Windows는 애플리케이션이 백그라운드에서 작동하는 방식을 관리할 수 있습니다. 예를 들어, 배터리를 절약하기 위해 배터리 절약 모드를 활성화하면 시스템은 모든 앱을 자동으로 닫습니다. 5. 애플리케이션이 백그라운드에서 실행되는 것을 방지하려면 [안함]을 선택합니다. 프로그램이 알림을 보내지 않거나 데이터를 업데이트하지 못하는 경우 등을 확인할 수 있습니다.

DeepSeek은 파일을 PDF로 직접 변환 할 수 없습니다. 파일 유형에 따라 공통 문서 (Word, Excel, PowerPoint) : Microsoft Office, LibreOffice 및 기타 소프트웨어를 사용하여 PDF로 내보내십시오. 이미지 : 이미지 뷰어 또는 이미지 처리 소프트웨어를 사용하여 PDF로 저장하십시오. 웹 페이지 : 브라우저의 "PDF로 인쇄"기능 또는 전용 웹 페이지에서 PDF 도구를 사용하십시오. 드문 형식 : 오른쪽 변환기를 찾아 PDF로 변환하십시오. 올바른 도구를 선택하고 실제 상황에 따라 계획을 개발하는 것이 중요합니다.

앱을 사용하려고 할 때 "카메라 및 마이크에 대한 접근을 허용할 수 없습니다"라는 메시지가 표시됩니까? 일반적으로 필요에 따라 특정 사람에게 카메라 및 마이크 권한을 부여합니다. 단, 권한을 거부할 경우 카메라와 마이크가 작동하지 않으며 대신 이런 오류 메시지가 표시됩니다. 이 문제를 해결하는 것은 매우 기본적이며 1~2분 안에 완료할 수 있습니다. 수정 1 – 카메라, 마이크 권한 제공 설정에서 직접 필요한 카메라 및 마이크 권한을 제공할 수 있습니다. 1단계 - 설정 탭으로 이동합니다. 2단계 – 개인 정보 보호 및 보안 패널을 엽니다. 3단계 - 거기에서 "카메라" 권한을 켭니다. 4단계 - 내부에서 휴대폰 카메라에 대한 권한을 요청한 앱 목록을 찾을 수 있습니다. 5단계 - 지정된 앱의 "카메라"를 엽니다.

Java의 DAO(Data Access Object)는 애플리케이션 코드와 지속성 계층을 분리하는 데 사용되며 다음과 같은 장점이 있습니다. 분리: 애플리케이션 로직에서 독립되어 수정이 쉽습니다. 캡슐화: 데이터베이스 액세스 세부 정보를 숨기고 데이터베이스와의 상호 작용을 단순화합니다. 확장성: 새로운 데이터베이스 또는 지속성 기술을 지원하기 위해 쉽게 확장할 수 있습니다. DAO를 사용하면 애플리케이션은 데이터베이스 세부 정보를 직접 처리하지 않고도 엔터티 생성, 읽기, 업데이트 및 삭제와 같은 데이터베이스 작업을 수행하는 메서드를 호출할 수 있습니다.

Java에서 "필드"는 데이터나 상태를 저장하는 데 사용되는 클래스나 인터페이스의 데이터 멤버입니다. 필드의 속성에는 유형(Java 데이터 유형일 수 있음), 액세스 권한, 정적(인스턴스가 아닌 클래스에 속함), 최종(불변) 및 임시(직렬화되지 않음)가 포함됩니다. 필드는 객체 데이터 저장, 객체 상태 유지 등 클래스나 인터페이스의 상태 정보를 저장하는 데 사용됩니다.

샤오미 Mi 15 시리즈는 10월 정식 출시될 예정이며, 전체 시리즈 코드명이 외신 MiCode 코드베이스에 노출됐다. 그중 주력 제품인 샤오미 미 15 울트라의 코드명은 '쉬안위안(Xuanyuan)'('쉬안위안(Xuanyuan)'이라는 뜻)이다. 이 이름은 중국 신화 속 황제(Yellow Emperor)에서 유래한 것으로 귀족을 상징한다. Xiaomi 15의 코드명은 "Dada"이고, Xiaomi 15Pro의 이름은 "Haotian"("Haotian"을 의미)입니다. Xiaomi Mi 15S Pro의 내부 코드명은 "dijun"으로, "산과 바다의 고전"의 창조신인 Jun 황제를 암시합니다. Xiaomi 15Ultra 시리즈 커버

Java 리플렉션 메커니즘을 사용하면 프로그램은 소스 코드를 수정하지 않고도 클래스의 동작을 동적으로 수정할 수 있습니다. Class 객체를 통해 클래스를 조작하면 newInstance()를 통해 인스턴스를 생성하고, 프라이빗 필드 값을 수정하고, 프라이빗 메서드를 호출하는 등의 작업을 수행할 수 있습니다. 그러나 리플렉션은 예상치 못한 동작 및 보안 문제를 일으킬 수 있고 성능 오버헤드가 있으므로 주의해서 사용해야 합니다.

Vue에서 iframe 교차 도메인 문제를 해결하는 방법: CORS: 백엔드 서버에서 CORS 지원을 활성화하고 XMLHttpRequest를 사용하거나 API를 가져와 Vue에서 CORS 요청을 보냅니다. JSONP: 백엔드 서버의 JSONP 엔드포인트를 사용하여 Vue에서 JSONP 스크립트를 동적으로 로드합니다. 프록시 서버: 요청을 전달하도록 프록시 서버를 설정하고, Vue에서 타사 라이브러리(예: axios)를 사용하여 요청을 보내고, 프록시 서버 URL을 설정합니다.
