Saya ingin membuat alias untuk nama kelas. Sintaks berikut akan menjadi sempurna:
public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
...
}
public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;
tetapi tidak dapat dikompilasi.
Contoh
Catatan Contoh ini diberikan hanya untuk kenyamanan. Jangan mencoba memecahkan masalah khusus ini dengan menyarankan untuk mengubah desain seluruh sistem. Ada atau tidaknya contoh ini tidak mengubah pertanyaan awal.
Beberapa kode yang ada bergantung pada keberadaan kelas statis:
public static class ColorScheme
{
...
}
Skema warna ini adalah skema warna Outlook 2003. saya ingin memperkenalkan skema warna Outlook 2007, dengan tetap mempertahankan skema warna Outlook 2003:
public static class Outlook2003ColorScheme
{
...
}
public static class Outlook2007ColorScheme
{
...
}
Tetapi saya masih dihadapkan pada fakta bahwa kode tersebut bergantung pada keberadaan kelas statis yang disebut ColorScheme
. Pikiran pertama saya adalah membuat ColorScheme
kelas yang akan saya warisi dari salah satu Outlook2003
atau Outlook2007
:
public static class ColorScheme : Outlook2007ColorScheme
{
}
tetapi Anda tidak dapat mewarisi dari kelas statis.
Pikiran saya selanjutnya adalah membuat ColorScheme
kelas statis , tetapi membuat Outlook2003ColorScheme
dan Outlook2007ColorScheme
kelas non-statis. Kemudian variabel statis di ColorScheme
kelas statis dapat mengarah ke salah satu skema warna "benar":
public static class ColorScheme
{
private static CustomColorScheme = new Outlook2007ColorScheme();
...
}
private class CustomColorScheme
{
...
}
private class Outlook2008ColorScheme : CustomColorScheme
{
...
}
private class Outlook2003ColorScheme : CustomColorScheme
{
...
}
tetapi itu akan mengharuskan saya untuk mengubah kelas yang terdiri dari keseluruhan Warna statis yang dapat dibaca menjadi properti yang dapat diganti, dan kemudian ColorScheme
kelas saya harus memiliki 30 pengambil properti berbeda yang dimasukkan ke dalam objek yang terkandung.
Itu terlalu banyak mengetik.
Jadi pikiran saya selanjutnya adalah membuat alias kelas:
public static ColorScheme = Outlook2007ColorScheme;
Tapi itu tidak bisa dikompilasi.
Bagaimana cara membuat alias kelas statis menjadi nama lain?
Pembaruan: Bisakah seseorang menambahkan jawaban "Anda tidak dapat melakukan ini di C #" , jadi saya dapat menandainya sebagai jawaban yang diterima. Orang lain yang menginginkan jawaban untuk pertanyaan yang sama akan menemukan pertanyaan ini, jawaban yang diterima, dan sejumlah solusi yang mungkin, atau mungkin tidak, berguna.
Saya hanya ingin menutup pertanyaan ini.
sumber
interface
, yang diimplementasikan oleh semua kelas Anda. Seperti yang disebutkan dalam jawaban chills42 . Anda kemudian dapat menentukan "layanan" atau "pabrik" yang mengembalikan objek yang mengimplementasikan antarmuka itu, bergantung pada keadaan saat ini (misalnya platform / OS) atau pada file konfigurasi.Jawaban:
Tidak boleh . Hal terbaik berikutnya yang dapat Anda lakukan adalah memiliki
using
deklarasi di file yang menggunakan kelas tersebut.Misalnya, Anda dapat menulis ulang kode dependen menggunakan alias import (sebagai
typedef
pengganti semu ):using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;
Sayangnya ini harus masuk ke setiap ruang lingkup / file yang menggunakan nama tersebut.
Oleh karena itu, saya tidak tahu apakah ini praktis dalam kasus Anda.
sumber
using
harus ditambahkan ke semua kode yang rusak. Dan itu juga meniadakan nilai memiliki satu alias, yang memungkinkan saya mengalihkan semua pengguna dariColorScheme
kelas yang ada untuk menggunakan kelas baru - tanpa perubahan. Dengan kata lain: saya ingin memasukkanColorScheme
kelas ke kelas lain.Anda dapat membuat alias untuk kelas Anda dengan menambahkan baris kode ini:
using Outlook2007ColorScheme = YourNameSpace.ColorScheme;
sumber
Imports
. Apakah aku salah?using
direktif di dalam namespace itu, misalnya ketika Anda membutuhkan alias dari kelas Anda sendiri.Anda menginginkan ( Factory | Singleton ), tergantung pada kebutuhan Anda. Premisnya adalah membuatnya sehingga kode klien tidak harus tahu skema warna mana yang didapatnya. Jika skema warna harus diterapkan secara luas, satu warna tunggal sudah cukup. Jika Anda dapat menggunakan skema yang berbeda dalam keadaan yang berbeda, pola Pabrik mungkin merupakan cara yang tepat. Bagaimanapun juga, ketika skema warna perlu diubah, kode hanya perlu diubah di satu tempat.
public interface ColorScheme { Color TitleBar { get; } Color Background{ get; } ... } public static class ColorSchemeFactory { private static ColorScheme scheme = new Outlook2007ColorScheme(); public static ColorScheme GetColorScheme() { //Add applicable arguments return scheme; } } public class Outlook2003ColorScheme: ColorScheme { public Color TitleBar { get { return Color.LightBlue; } } public Color Background { get { return Color.Gray; } } } public class Outlook2007ColorScheme: ColorScheme { public Color TitleBar { get { return Color.Blue; } } public Color Background { get { return Color.White; } } }
sumber
Anda tidak dapat membuat alias nama kelas di C #.
Ada hal-hal yang dapat Anda lakukan yang tidak aliasing nama kelas di C #.
Tetapi untuk menjawab pertanyaan awal: Anda tidak dapat membuat alias nama kelas di C #.
Pembaruan: Orang-orang bingung mengapa
using
tidak berfungsi. Contoh:Form1.cs
private void button1_Click(object sender, EventArgs e) { this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor); }
ColorScheme.cs
class ColorScheme { public static Color ApplyColorScheme(Color c) { ... } }
Dan semuanya bekerja. Sekarang saya ingin membuat kelas baru , dan alias
ColorScheme
untuk itu (sehingga tidak ada kode yang perlu diubah ):ColorScheme.cs
using ColorScheme = Outlook2007ColorScheme; class Outlook2007ColorScheme { public static Color ApplyColorScheme(Color c) { ... } }
Ohh, maafkan aku. Kode ini tidak dapat dikompilasi:
Pertanyaan saya adalah bagaimana membuat alias kelas di C #. Itu tidak bisa dilakukan. Ada hal-hal yang dapat saya lakukan yang tidak menggunakan nama kelas di C #:
ColorScheme
keusing
ColorScheme
bukan (kode perubahan solusi karena saya tidak bisa alias)ColorScheme
untuk menggunakan pola pabrik menjadi kelas atau antarmuka polimorfik (ubah kode solusi karena saya tidak bisa alias)Tetapi solusi ini melibatkan pemecahan kode yang ada: bukan opsi.
Jika orang bergantung pada keberadaan
ColorScheme
kelas, saya harus benar-benar menyalin / menempelkanColorScheme
kelas.Dengan kata lain: saya tidak bisa membuat alias nama kelas di C #.
Ini kontras dengan bahasa berorientasi objek lainnya, di mana saya dapat mendefinisikan alias:
dan saya akan selesai.
sumber
coba ini:
using ColorScheme=[fully qualified].Outlook2007ColorScheme
sumber
Saya menambahkan komentar ini untuk pengguna yang menemukan ini lama setelah OP menerima "jawaban" mereka. Aliasing di C # bekerja dengan menentukan nama kelas menggunakan namespace yang memenuhi syarat. Setelah ditentukan, nama alias dapat digunakan dalam cakupannya. Contoh.
using aliasClass = Fully.Qualified.Namespace.Example; //Example being the class in the Fully.Qualified.Namespace public class Test{ public void Test_Function(){ aliasClass.DoStuff(); //aliasClass here representing the Example class thus aliasing //aliasClass will be in scope for all code in my Test.cs file } }
Permintaan maaf untuk kode yang diketik dengan cepat tapi mudah-mudahan ini menjelaskan bagaimana ini harus diterapkan sehingga pengguna tidak disesatkan menjadi percaya itu tidak dapat dilakukan di C #.
sumber
namespace Fully.Qualified.Namespace{
public class Example {
...public void DoStuff(){
...}
...}
}
.Aliasing seperti yang Anda inginkan tidak akan berhasil di C #. Ini karena aliasing dilakukan melalui
using
direktif, yang dibatasi pada file / namespace yang dimaksud. Jika Anda memiliki 50 file yang menggunakan nama kelas lama, itu berarti 50 tempat untuk memperbarui.Karena itu, menurut saya ada solusi mudah untuk membuat perubahan kode Anda seminimal mungkin. Jadikan
ColorScheme
kelas sebagai fasad untuk panggilan Anda ke kelas yang sebenarnya dengan implementasi, dan gunakanusing
dalam file tersebut untuk menentukan yangColorScheme
Anda gunakan.Dengan kata lain, lakukan ini:
using CurrentColorScheme = Outlook2007ColorScheme; public static class ColorScheme { public static Color ApplyColorScheme(Color c) { return CurrentColorScheme.ApplyColorScheme(c); } public static Something DoSomethingElse(Param a, Param b) { return CurrentColorScheme.DoSomethingElse(a, b); } }
Kemudian di belakang kode Anda, tidak ada perubahan apa pun:
private void button1_Click(object sender, EventArgs e) { this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor); }
Anda kemudian dapat memperbarui nilai
ColorScheme
dengan memperbarui satu baris kode (using CurrentColorScheme = Outlook2008ColorScheme;
).Beberapa masalah di sini:
ColorScheme
kelas dan keOutlook2007ColorScheme
kelas. Ini adalah pekerjaan ekstra, tetapi jika ini adalah kode warisan yang sebenarnya, ini seharusnya tidak sering terjadi. Sebagai bonus, kode diColorScheme
dalamnya sangat sederhana sehingga setiap kemungkinan bug sangat jelas terlihat.ColorScheme
kelas yang Anda gantikan, pendekatan ini dan lainnya bisa menjadi masalah. Saya akan menyarankan agar Anda mengganti nama kelas itu menjadi sepertiColorSchemeOld
, dan kemudian mengaksesnya melaluiusing CurrentColorScheme = ColorSchemeOld;
.sumber
Saya kira Anda selalu dapat mewarisi dari kelas dasar tanpa ada yang ditambahkan
public class Child : MyReallyReallyLongNamedClass {}
MEMPERBARUI
Tetapi jika Anda memiliki kemampuan refactoring
class
itu sendiri: Sebuah nama kelas biasanya tidak perlu panjang karena kurangnyanamespace
s.Jika Anda melihat kasus seperti
ApiLoginUser
,DataBaseUser
,WebPortalLoginUser
, biasanya indikasi kurangnyanamespace
karena takut bahwa namaUser
konflik kekuatan.Namun dalam kasus ini, Anda dapat menggunakan
namespace
alias , seperti yang telah ditunjukkan pada posting di atasusing LoginApi = MyCompany.Api.Login; using AuthDB = MyCompany.DataBase.Auth; using ViewModels = MyCompany.BananasPortal.Models; // ... AuthDB.User dbUser; using ( var ctxt = new AuthDB.AuthContext() ) { dbUser = ctxt.Users.Find(userId); } var apiUser = new LoginApi.Models.User { Username = dbUser.EmailAddess, Password = "*****" }; LoginApi.UserSession apiUserSession = await LoginApi.Login(apiUser); var vm = new ViewModels.User(apiUserSession.User.Details); return View(vm);
Perhatikan bagaimana semua
class
nama ituUser
, tetapi dalamnamespace
s yang berbeda . Mengutip PEP-20: Zen of Python :Semoga ini membantu
sumber
new
kata kunci untuk metode tersebut atau bahkan membuat ExtensionMethods Anda sendiri, bukan? Dalam hal apapun itu adalah pendapat kuat saya bahwa Anda harus selalu menggunakan kelas Vanilla Collection (yaitu Dictionary, List, IEnumerable, IQuerable, dll.) Dengan Model / ViewModels / POCO kustom. Seperti yang dinyatakanIColorScheme oColorScheme = ColorSchemeFactory.Create();
Juga, Anda mungkin ingin melihat Injeksi KetergantunganApakah mungkin untuk mengubah menggunakan antarmuka?
Mungkin Anda dapat membuat
IColorScheme
antarmuka yang diterapkan oleh semua kelas?Ini akan bekerja dengan baik dengan pola pabrik seperti yang ditunjukkan oleh Chris Marasti-Georg
sumber
Ini adalah jawaban parsial yang sangat terlambat - tetapi jika Anda menentukan kelas yang sama 'ColorScheme', di namespace yang sama 'Outlook', tetapi dalam rakitan terpisah, yang disebut Outlook2003 dan yang lainnya Outlook2007, maka yang perlu Anda lakukan hanyalah mereferensikan perakitan yang sesuai .
sumber