ในโซลูชันเดียวกันฉันมีสองโครงการ: P1 และ P2 ฉันจะใช้คลาส P1 ใน P2 ได้อย่างไร
ในโซลูชันเดียวกันฉันมีสองโครงการ: P1 และ P2 ฉันจะใช้คลาส P1 ใน P2 ได้อย่างไร
คำตอบ:
เพียงเพิ่มการอ้างอิงถึง P1 จาก P2
โปรดทราบว่าประเภทใน P1 ที่คุณต้องการเข้าถึงโดยตรงจะต้องมีระดับการเข้าถึงที่เพียงพอ: โดยทั่วไปหมายความว่าต้องเปิดเผยต่อสาธารณะ
พอเรือนถูกต้องฉันเพิ่งลองสร้างโครงการด้วยตัวเอง ฉันเพิ่งสร้าง SLN ทั้งหมดเพื่อทดสอบว่าทำงานได้หรือไม่
ฉันทำสิ่งนี้ใน VC # VS2008
<< (เพียงแค่ช่วยคนอื่น ๆ ที่อ่านสิ่งนี้ด้วย () ความคิดเห็น)
ขั้นตอนที่ 1:
สร้างโซลูชันที่เรียกว่า DoubleProject
ขั้นตอนที่ 2:
สร้างโครงการในโซลูชันชื่อ DoubleProjectTwo (ในการดำเนินการนี้เลือกไฟล์โซลูชันคลิกขวา -> เพิ่ม -> โครงการใหม่)
ตอนนี้ฉันมีสองโครงการในโซลูชันเดียวกัน
ขั้นที่ 3:
ตามที่ Paul Ruane ระบุไว้ ไปที่การอ้างอิงในตัวสำรวจโซลูชัน (หากปิดจะอยู่ในแท็บมุมมองของคอมไพเลอร์) DoubleProjectTwo เป็นฟังก์ชันที่ต้องการฟังก์ชัน / วิธีการของ DoubleProject ดังนั้นในการอ้างอิงเมาส์ขวาของ DoubleProjectTwo ที่นั่น -> เพิ่ม -> โครงการ -> DoubleProject
ขั้นตอนที่ 4:
รวมคำสั่งสำหรับเนมสเปซ:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProject; <------------------------------------------
namespace DoubleProjectTwo
{
class ClassB
{
public string textB = "I am in Class B Project Two";
ClassA classA = new ClassA();
public void read()
{
textB = classA.read();
}
}
}
ขั้นที่ 5:
ทำให้บางสิ่งบางอย่างแสดงหลักฐานผลลัพธ์:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DoubleProject
{
public class ClassA //<---------- PUBLIC class
{
private const string textA = "I am in Class A Project One";
public string read()
{
return textA;
}
}
}
หลัก
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProjectTwo; //<----- to use ClassB in the main
namespace DoubleProject
{
class Program
{
static void Main(string[] args)
{
ClassB foo = new ClassB();
Console.WriteLine(foo.textB);
Console.ReadLine();
}
}
}
นั่นควรทำเคล็ดลับ
หวังว่านี่จะช่วยได้
แก้ไข ::: อ๊ะลืมวิธีเรียกใช้เพื่อเปลี่ยนสตริงจริงอย่าทำแบบเดียวกัน :)
บ่อยครั้งที่นักพัฒนาใหม่ถามคำถามง่ายๆนี้ซึ่งเป็นปัญหาทั่วไปโดยเฉพาะกับ Visual Studio IDE มีเพียงไม่กี่คนที่ตอบคำถามที่เฉพาะเจาะจงและมักจะวิจารณ์คำถามหรือให้ "เดา" สำหรับวิธีแก้ปัญหาที่ไม่ตอบโจทย์ปัญหาทั่วไป ปัญหาแรกที่พบบ่อยคือ IDE ทำให้คุณสร้างโปรเจ็กต์ใหม่แทนที่จะเพิ่มไฟล์ใหม่ (.java, .py, .cpp, .c) ลงในโซลูชันที่มีอยู่ (โดยค่าเริ่มต้นจะสร้างโซลูชันใหม่) เว้นแต่คุณจะเปลี่ยนชื่อโปรเจ็กต์ และเพิ่มลงในโซลูชันปัจจุบัน ปัญหานี้เกิดขึ้นสำหรับโฟลเดอร์โครงการ Python, java, c #, C ++ และ C
สิ่งนี้จะไม่เกิดขึ้นเมื่อคุณเพิ่มโปรเจ็กต์อื่นโดยใช้คำสั่ง> project> project type ใหม่ของ IDE ปัญหาที่นี่คือโปรเจ็กต์ใหม่ถูกเก็บไว้ในไดเร็กทอรีอื่นนอกเหนือจากไฟล์โค้ด Client หรือ User interface ที่มีอยู่ ในการสร้าง "ไฟล์" ใหม่ในพื้นที่โปรเจ็กต์เดิมแทนที่จะเป็นโปรเจ็กต์ใหม่ผู้เริ่มต้นจะต้องทำสิ่งต่อไปนี้เพื่อที่ Microsoft จะไม่ทำเพื่อคุณและยังทำให้คุณเข้าใจผิดไปจากค่าเริ่มต้นที่ชัดเจนโดยสังหรณ์ใจ
ตอนนี้คำแนะนำรหัสเพื่อนำเข้าไลบรารีหรือการใช้เนมสเปซจะทำงานตามที่อธิบายไว้ในความคิดเห็นด้านบนและคุณไม่จำเป็นต้องเปลี่ยนคำสั่งเส้นทางหรือเปลี่ยนเส้นทางโซลูชันและชื่อโซลูชันที่ Microsoft ไม่ยอมให้คุณเปลี่ยนได้อย่างง่ายดาย (เช่นคุณสามารถเปลี่ยน ชื่อไฟล์หรือชื่อโปรเจ็กต์ แต่ IDE จะไม่เปลี่ยนเส้นทางโปรเจ็กต์หรือชื่อพา ธ โซลูชันโดยอัตโนมัติ)
ต่อไปนี้เป็นตัวอย่าง Python แต่ทำงานคล้ายกันสำหรับ C #, java หรือ C / C ++ โดยใช้คำสั่ง include, namespaces หรือใช้รหัสที่เหมาะสมกับแต่ละภาษาเพื่อค้นหาโค้ดในคลาส / โปรเจ็กต์อื่น ๆ ใน DIRECTORY SPACE เดียวกัน
ไฟล์แอปพลิเคชัน "hello world" นำเข้าจากไฟล์รหัสอื่นในไดเรกทอรีเดียวกัน
โปรดสังเกตว่าตัวคั่นช่องว่างสีขาวของ python จะไม่เว้นวรรคอย่างถูกต้องในตัวแก้ไขความคิดเห็น stackoverflow นี้:
print ("test")
from CIXMPythonFacade import ClassA
c1=ClassA
c1.methodA()
from CIXMPythonFacade import functionA
functionA()
class ClassName(object):
def __init__(object, parameter):
object.parameter = value
ไฟล์ไลบรารีหรือไฟล์ "façade" ที่มีคลาสวิธีการหรือฟังก์ชันที่คุณต้องการนำเข้า
class class1(object):
"""description of class"""
class ClassA(object):
print ("test2")
def methodA():
print ("test3")
def functionA ():
print ("test4")
return (0)
pass
ตอนนี้คุณจะแก้ปัญหาความยุ่งเหยิงที่ IDE นำคุณไปสู่อะไรได้อย่างไร? ในการนำเข้ารหัสจากไฟล์อื่นในพื้นที่ไดเร็กทอรีเดียวกันให้คุณเพิ่มการอ้างอิงลงไป
ตกลงตอนนี้คุณได้แก้ไขปัญหานี้แล้วคุณจะเชื่อมโยงโครงการสองโครงการเข้าด้วยกันในพื้นที่โซลูชันเดียวกันได้อย่างไร
Microsoft ต้องการแก้ไขปัญหาเหล่านี้จริงๆเพื่อให้คุณสามารถสร้างสิ่งที่คนส่วนใหญ่ต้องการสร้างเป็นไฟล์ใหม่ในไดเร็กทอรีเดียวกันและลบโซลูชันโดยการเลือกและลบออกจาก IDE ผู้เริ่มต้นรู้สึกผิดหวังอย่างมากกับคำสั่งเส้นทางไดเรกทอรีที่ยืดหยุ่นสำหรับนักพัฒนาที่มีประสบการณ์ แต่ก็ไม่ยุติธรรมสำหรับนักพัฒนาใหม่ในค่าเริ่มต้นของพวกเขา
หวังว่านี่จะช่วยคุณได้จริง ๆ และหยุดนักพัฒนามือฉมังจากการให้คำตอบผิด ๆ ที่ไม่เหมาะกับคุณ พวกเขาถือว่าคุณเข้าใจคำสั่งเส้นทางแล้วและเพียงแค่ต้องการพิมพ์รหัสที่ถูกต้อง ... ซึ่งเป็นสาเหตุที่อุโมงค์พยายามแก้ไขรหัสของคุณ แต่ไม่ได้ช่วยคุณแก้ไขปัญหา นี่อาจเป็นปัญหาที่พบบ่อยที่สุดที่อธิบายไว้อย่างต่อเนื่องใน stackoverflow พร้อมคำตอบที่ไม่ถูกต้องซึ่งใช้ไม่ได้กับโปรแกรมเมอร์มือใหม่
ขั้นตอนแรกคือทำการอ้างอิง P2 P1 โดยทำดังต่อไปนี้
ถัดไปคุณจะต้องตรวจสอบให้แน่ใจว่าคลาสใน P1 สามารถเข้าถึง P2 ได้ public
วิธีที่ง่ายที่สุดคือการทำให้พวกเขา
public class MyType { ... }
ตอนนี้คุณควรจะสามารถใช้มันใน P2 ผ่านชื่อที่มีคุณสมบัติครบถ้วน สมมติว่าเนมสเปซของ P1 คือ Project1 สิ่งต่อไปนี้จะใช้ได้
Project1.MyType obj = new Project1.MyType();
วิธีที่ต้องการคือการเพิ่มการใช้เพื่อProject1
ให้คุณสามารถใช้ประเภทที่ไม่มีคุณสมบัติ
using Project1;
...
public void Example() {
MyType obj = new MyType();
}
หากคุณมีสองโปรเจ็กต์ในโฟลเดอร์โซลูชันเดียวเพียงแค่เพิ่มการอ้างอิงของโปรเจ็กต์ลงในอีกอันการใช้เนมสเปซคุณจะได้รับคลาส ในขณะที่สร้างอ็อบเจ็กต์สำหรับคลาสที่ต้องการ เรียกใช้วิธีการที่คุณต้องการ
โครงการแรก:
class FirstClass()
{
public string Name()
{
return "James";
}
}
เพิ่มการอ้างอิงถึงโครงการที่สองที่นี่
โครงการที่สอง:
class SeccondClass
{
FirstProject.FirstClass obj=new FirstProject.FirstClass();
obj.Name();
}
ในโปรเจ็กต์ P1 กำหนดให้คลาสเป็นสาธารณะ (ถ้ายังไม่ได้ทำ) จากนั้นเพิ่มการอ้างอิงโครงการ (แทนที่จะเป็นการอ้างอิงไฟล์ซึ่งเป็นข้อผิดพลาดที่ฉันพบเป็นครั้งคราว) ไปที่ P2 เพิ่มคำสั่งใช้ใน P2 ในตำแหน่งที่ถูกต้องและเริ่มใช้คลาสจาก P1
(เพื่อกล่าวถึงสิ่งนี้: ทางเลือกในการทำให้คลาสเป็นสาธารณะคือการทำให้ P2 เป็นเพื่อนกับ P1 อย่างไรก็ตามนี่ไม่น่าจะเป็นคำตอบที่คุณต้องการเพราะมันจะมีผลบางอย่างดังนั้นให้ปฏิบัติตามคำแนะนำข้างต้น)
สมมติว่าชั้นเรียนของคุณในโครงการ 2 เรียกว่า MyClass
แน่นอนอันดับแรกอ้างอิงโครงการ 2 ของคุณภายใต้การอ้างอิงในโครงการ 1 จากนั้น
using namespaceOfProject2;
// for the class calling bit:
namespaceOfProject2.MyClass project2Class = new namespaceOfProject2.MyClass();
ดังนั้นเมื่อใดก็ตามที่คุณต้องการอ้างอิงคลาสนั้นให้คุณพิมพ์ project2Class และตรวจสอบให้แน่ใจว่าชั้นเรียนเป็นแบบสาธารณะด้วย
ฉันมีปัญหากับกรอบเป้าหมายที่แตกต่างกัน
ฉันทำทุกอย่างถูกต้อง แต่ใช้การอ้างอิงใน P2 ไม่ได้ หลังจากที่ฉันกำหนดกรอบเป้าหมายเดียวกันสำหรับ P1 และ P2 มันทำงานได้อย่างมีเสน่ห์
หวังว่ามันจะช่วยใครสักคน
The name ... does not exist in the current context. Cannot resolve symbol ...
จนกว่าฉันจะเปลี่ยนกรอบเป้าหมายของโครงการให้ตรงกัน (คลิกขวาที่โปรเจ็กต์แล้วไปที่Project -> Properties -> Target framework
การเปลี่ยนแปลง)